【问题标题】:Filter matrix by multiple column values w/o loops (Matlab)?通过不带循环的多列值过滤矩阵(Matlab)?
【发布时间】:2015-05-18 09:21:43
【问题描述】:

假设我有以下内容:

  • 数据矩阵Mm-by-n);
  • 匹配行 V (1-by-n);
  • 匹配位置 I1-by-n 合乎逻辑);

我想在匹配位置 I 处过滤所有与 V 具有相同值的 M 行。我相信如果 Matlab 索引功能足够强大,可以在没有循环的情况下做到这一点。但是怎么做呢?


当前解决方案:遍历所有列并更新过滤后的行位置 Fm-by-1 合乎逻辑)。

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

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    这是一种方法:

    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
    

    【讨论】:

    • 谢谢,这是一个简洁明了的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多