我想在MATLAB中的向量上应用filter函数。

在Python中,我这样写:

l = [1,2,3,4]
l2 = filter(lambda x:x>2,l)


如何在MATLAB中编写此代码?

最佳答案

MATLAB中最接近的等效项是使用logical索引来过滤掉不需要的元素:

l = [1,2,3,4];
l2 = l(l > 2);


Python中的filter所做的是,假设您为列表中的每个元素指定的谓词的评估结果为True,它将返回另一个列表。从列表中删除所有False元素。同样,在MATLAB中,您可以使用logical索引直接索引到数组中,以实现相同的目的。



那么l2 = l(l > 2);到底是做什么的呢?基本上,l > 2为您提供TrueFalse的数组,其大小与l相同。在MATLAB中将如下所示:

>> l = [1,2,3,4]

l =

     1     2     3     4

>> l > 2

ans =

     0     0     1     1


如您所见,l > 2返回与logical大小相同的l向量。这里显示的是l的每个值是否满足其大于2的谓词。正如预期的那样,前两个元素是False,而后两个元素是True。通过将此logical向量用作向量l的输入,您正在建立索引,以便选择与此向量中等于True的任何位置,选择l中的相应位置,而选择False >过滤掉。这样,前两个元素将被删除,因为它们是False,而后两个元素将保留,因为这些位置是True

因此,执行l2 = l(l > 2);可以得出:

>> l2 = l(l > 2)

l2 =

     3     4


从Steve Eddins的博客中了解有关logical索引的更多信息:http://blogs.mathworks.com/steve/2008/01/28/logical-indexing/



奖金

但是,如果您确实想使用filter范例,则可以定义一个可以执行此操作的函数,如下所示:

function out = filter_python(in, func)
    out = in(func(in));
end


这不会进行错误检查,您需要确保func是接受向量的函数,并且输出也是与输入向量in大小相同的向量。该函数还需要为输入向量中的每个元素返回True/False

请注意,我之所以称其为filter_python,是因为filter是MATLAB中已经存在的函数,它是Signal Processing Toolbox的一部分。将此保存到名为filter_python.m的文件中。现在,您已经完成了,可以这样称呼它:

l = [1,2,3,4];
l2 = filter_python(l, @(x) x > 2);


@(x)是一个匿名函数,就像lambda x在Python中一样。



另外,在IPython中,这是我们得到的:

In [13]: %paste
l = [1,2,3,4]
l2 = filter(lambda x:x>2,l)

## -- End pasted text --

In [14]: l
Out[14]: [1, 2, 3, 4]

In [15]: l2
Out[15]: [3, 4]


....以及在MATLAB中(如我们先前所示):

>> l = [1,2,3,4];
>> l2 = l(l > 2);
>> l2

l2 =

     3     4


与自定义函数类似:

>> l = [1,2,3,4];
>> l2 = filter_python(l, @(x) x > 2);
>> l2

l2 =

     3     4

关于python - MATLAB中“过滤器”的等效Python函数是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32598861/

10-12 22:18