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

Pra*_*sas 6 arrays matlab matrix

说我有以下内容:

  • 数据矩阵M(m -by- n);
  • 匹配行V(1- by- n);
  • 匹配位置I(1- by- n logical);

我想过滤匹配位置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,:);
Run Code Online (Sandbox Code Playgroud)

Lui*_*ndo 3

这是一种方法:

result = M(all(bsxfun(@eq, M(:,I), V(I)), 2), :);
Run Code Online (Sandbox Code Playgroud)

怎么运行的

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

例子

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
Run Code Online (Sandbox Code Playgroud)