这似乎是一个简单的问题,但我一直无法在任何地方找到答案。如果我有一个A
由任意数量的行组成的 Matlab 矩阵,我将如何根据某个函数的值f
(其参数是行向量)过滤这些行?换句话说,我将如何只保留为的A
矩阵f
行true
?我试过
A(f(A(:)), :)
但没有成功。任何帮助将不胜感激。
正如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) ) );
这个问题有点不清楚(你应该提供你的过滤标准),但听起来你只需要利用 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;
在没有 的命令行中尝试,;
你会看到它沿行求和(2
在 sum 参数中),并且只选择那些大于10
创建逻辑向量(Matlab 的布尔类型)的那些。现在过滤 A 它只是:
A(rowsToFilter, :) = [];
= [] 将我们要过滤的行设置为空向量,Matlab 将其理解为从矩阵中删除这些元素。
您可以通过选择要保留的行来做同样的事情,如下所示:
rowsToKeep = sum(A, 2) <= 10;
A = A(rowsToKeep, :);
您会注意到最后一种形式与您尝试使用的形式非常相似f(A) = sum(A, 2) <= 10