通过多列值w / o循环过滤矩阵(Matlab)?

时间:2015-05-18 09:21:44

标签: arrays matlab matrix

说我有以下内容:

  • 数据矩阵 M m -by- n );
  • 匹配行 V 1 -by- n );
  • 匹配职位 1 -by- n 逻辑);

我想在匹配位置 I 过滤所有与 V 相同的 M 行。我相信Matlab索引如果足够强大,可以在没有循环的情况下完成。但是如何?

当前解决方案:运行所有列并更新已过滤的行位置 F m -by- 1 逻辑)。

F = true(m,1);
for k = 1:n;
    if I(k);
        F = F & (M(:,k)==V(k));
    end;
end;
M = M(F,:);

1 个答案:

答案 0 :(得分:3)

以这种方式:

result = M(all(bsxfun(@eq, M(:,I), V(I)), 2), :);

工作原理

M(:,I)的每一行使用bsxfun与行向量V(I)进行元素比较。选择all列匹配的行。生成的逻辑向量用于索引M的行。

示例

M = [ 8     3     6     9
      5     4     9     8
      8     9     6     9 ];
I = [ true false true true ];
V = [ 8    1     6     9 ];

>> result = M(all(bsxfun(@eq, M(:,I), V(I)), 2), :)
result =
     8     3     6     9
     8     9     6     9