如何根据MATLAB矩阵第三列的取值提取前两列数据
如何根据MATLAB矩阵第三列的取值提取前两列数据
嗨,我来帮你搞定这个MATLAB的索引问题~
你之前的代码Test = A(A(:,3) == Val);之所以只得到类似“第一列”的结果,其实是因为MATLAB的索引规则在搞事情:当你只用一个一维的逻辑向量去索引二维矩阵时,它会把这个逻辑向量当作线性索引来用(按列优先的顺序遍历矩阵),最后会把所有符合条件的元素拉成一个列向量,而不是你想要的保留前两列的子矩阵。
要实现你想要的效果,只需要在索引时同时指定行筛选条件和列范围就可以了,正确的写法有两种:
分步写法(更清晰,适合新手)
% 先获取第三列等于Val的所有行的逻辑索引 row_mask = A(:, 3) == Val; % 提取这些行的第1、2列 Test = A(row_mask, [1, 2]);
合并写法(更简洁)
Test = A(A(:, 3) == Val, [1, 2]);
举个直观的例子验证
假设你的矩阵A是这样的:
A = [1 2 3; 4 5 6; 7 8 3; 9 10 6]; Val = 3;
用上面的正确代码运行后,Test会得到:
1 2 7 8
完全符合你想要的——提取第三列等于3的行的前两列。
而如果用你之前的代码A(A(:,3)==Val),得到的结果会是:
1 7 2 8 3 3
这就是你误以为“只提取第一列”的原因——它把符合条件的两行的所有元素(共6个)按列优先的顺序拼成了一个列向量,自然看起来和你要的结果不一样啦。
备注:内容来源于stack exchange,提问作者Shinobii




