这似乎是一个简单的问题,但我无法在任何地方找到答案。如果我有一个由任意行数组成的Matlab矩阵A
,我将如何基于某个函数f
(其参数是行向量)的值来过滤这些行?换句话说,我如何只保留A
为f
的矩阵true
的行?我试过了
A(f(A(:)), :)
但没有成功。任何帮助将不胜感激。
答案 0 :(得分:4)
当Dan回答时,您可以根据逻辑向量过滤矩阵的行。让selectRows
成为一个逻辑向量,numel(selectRows) == size(A,1)
为true
表示要保留的行,false
表示要丢弃的行。然后:
A( ~selectRows, : ) = [];
将删除selectRows == false
。
现在,问题是如何使用函数selectRows
生成逻辑向量f
?
如果f
知道如何处理多行,并相应地返回多个true
/ false
值,那么
selectRows = f(A);
应该做的伎俩。
但是,如果f
只知道如何一次处理一行,则需要循环遍历行。这样做的一种方法是
selectRows = cellfun( @f, mat2cell( A, ones(size(A,1)), size(A,2) ) );
答案 1 :(得分:2)
问题有点不清楚(你应该提供过滤的标准),但听起来你只需要使用Matlab的逻辑索引。
尝试这个非常人为的例子:
A = rand(7)
A = A(logical([1 1 0 0 0 1 1]), :)
这里我通过告诉Matlab要保留哪些行和哪些列(在我们的例子中都是这些列)来过滤行3 - 5。
您可以通过将矢量创建为条件来避免丑陋的转换:
A = rand(5)
A([1 0 1 1 0] == 1, :)
当然,如果我们知道您的过滤标准,那么以这种方式创建逻辑索引就会简单得多。举个例子,假设你想要过滤所有总和大于10的行。步骤1是找到那些行(要保留的行或要过滤的行,这没关系):
rowsToFilter = sum(A, 2) > 10;
在没有;
的命令行中尝试使用它,你会看到它沿着行(sum参数中的2
)求和,并只选择那些大于{{1}的行。通过创建逻辑向量(Matlab的布尔类型)。现在过滤A只是:
10
= []将我们想要过滤的行设置为空向量,Matlab将其理解为从矩阵中删除这些元素。
你可以通过选择要保留的行来做同样的事情:
A(rowsToFilter, :) = [];
您会注意到最后一种形式与您尝试使用rowsToKeep = sum(A, 2) <= 10;
A = A(rowsToKeep, :);