2

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

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

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

4

2 回答 2

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) ) );
于 2013-02-19T12:07:29.477 回答
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

于 2013-02-19T06:57:11.067 回答