根据Matlab中的函数值过滤矩阵行

时间:2013-02-18 19:38:16

标签: matlab matrix filter row

这似乎是一个简单的问题,但我无法在任何地方找到答案。如果我有一个由任意行数组成的Matlab矩阵A,我将如何基于某个函数f(其参数是行向量)的值来过滤这些行?换句话说,我如何只保留Af的矩阵true的行?我试过了

A(f(A(:)), :)

但没有成功。任何帮助将不胜感激。

2 个答案:

答案 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, :);

的形式非常相似