我想在MATLAB中对矢量应用l = [1,2,3,4]
l2 = filter(lambda x:x>2,l)
函数。
在Python中我写道:
child_process
我如何在MATLAB中写这个?
答案 0 :(得分:1)
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中已存在的函数,它是信号处理工具箱的一部分。将其保存到名为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
答案 1 :(得分:0)
扩展@rayryeng的示例(奖励)答案:
function out = filter_python(in, func) out = in(func(in)); end
这个想法可以扩展到2D数组中的整行数据。
function out = filtrow(func,in,colnum)
if nargin == 2
colnum=0;
sz = size(in);
if sz(1)==1 || sz(2)==1
out = in(func(in));
return
else
out = in;
for i = sz(2):-1:1
out = out(func(out(:,i)),:);
end
end
end
if nargin == 3
out = in(func(in(:,colnum)),:);
end
或者如果你喜欢cols。
function out = filtcol(func,in,rownum)
if nargin == 2
rownum=0;
sz = size(in);
if sz(1)==1 || sz(2)==1
out = in(func(in));
return
else
out = in';
for i = sz(2):-1:1
out = out(func(out(:,i)),:);
end
out = out';
end
end
if nargin == 3
out = in';
out = out(func(out(:,rownum)),:);
out = out';
end
所以给定矩阵A:
A =
0 0.4694 0.1656 0.0838 0.0782 0.8687 0.1818
0.0540 0 0.6020 0.2290 0.4427 0.0844 0.2638
0.5308 0.3371 0 0.9133 0.1067 0.3998 0.1455
0.7792 0.1622 0.6541 0 0.9619 0.2599 0.1361
0.9340 0.7943 0.6892 0.8258 0.0046 0.8001 0.8693
0.1299 0.3112 0.7482 0.5383 0.7749 0.4314 0.5797
0.5688 0.5285 0.4505 0.9961 0.8173 0.9106 0.5499
#%%% We can also remove entire rows or cols by this method
#%%% here we use filtrow to remove rows where elements do no pass the c condition function
>> out = filtrow(@(x) x>0,A)
out =
0.9340 0.7943 0.6892 0.8258 0.0046 0.8001 0.8693
0.1299 0.3112 0.7482 0.5383 0.7749 0.4314 0.5797
0.5688 0.5285 0.4505 0.9961 0.8173 0.9106 0.5499
#%%% Or we can do the same to remove the cols
>> out = filtcol(@(x) x>0,A)
out =
0.0782 0.8687 0.1818
0.4427 0.0844 0.2638
0.1067 0.3998 0.1455
0.9619 0.2599 0.1361
0.0046 0.8001 0.8693
0.7749 0.4314 0.5797
0.8173 0.9106 0.5499
#%%%Or you could filter by individual rows
>> out = filtrow(@(x) x>0,A,1)
out =
0.0540 0 0.6020 0.2290 0.4427 0.0844 0.2638
0.5308 0.3371 0 0.9133 0.1067 0.3998 0.1455
0.7792 0.1622 0.6541 0 0.9619 0.2599 0.1361
0.9340 0.7943 0.6892 0.8258 0.0046 0.8001 0.8693
0.1299 0.3112 0.7482 0.5383 0.7749 0.4314 0.5797
0.5688 0.5285 0.4505 0.9961 0.8173 0.9106 0.5499