我想在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
为您提供True
和False
的数组,其大小与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/