我的问题是:我怎样才能在Matlab中执行类似于Haskell或Python的List comprehension? 要完成Matlab中的功能,如下所示:
for xxx
if condition
expression1;
else
expression2;
end
end
我最初的目标是利用向量化操作并减少代码中的for循环,使其运行得更快。
编辑:我希望答案没有必要与arrayfun相关的东西,更喜欢vectoried操作方法。
还有另一个与此问题相关的问题(通过名为“arrayfun”的函数)。 Matlab中的匿名函数只有1行,那我怎么能在其中写if-else表达式呢?
谢谢大家~~
答案 0 :(得分:1)
您不能在Matlab中的匿名函数中使用if
。但是,您可以使用arrayfun
来解决这个问题,方法是定义自己的函数来执行语句和条件,例如:
function result = iff(condition, v1, v2)
if condition
result = v1;
else
result = v2;
end
然后在arrayfun
中,您可以执行以下操作:
arrayfun(@(x) iff(mod(x,2)==0, x , 0), [1:10])
结果:
0 2 0 4 0 6 0 8 0 10
这是基于对类似问题here的回答。
答案 1 :(得分:1)
arrayfun
实际上并没有摆脱循环,只是意味着你不必明确地输出它们。也就是说,在新的Matlabs中,循环不再那么慢了。但是可能有一种完全矢量化的方式来做你想做的事情,我并不是说它必然会更快(但我认为它会用旧的matlabs):
您可以利用Matlab将逻辑自动转换为double的方式,即false为0,true为true。例如
A = rand(10,1);
假设您想要将0.7以上的值乘以2,否则您必须减去5然后才能去
(A*2).*(A>0.7) + (A-5).*(A<=0.7);
当然,在这样一个简单的例子中,您也可以使用逻辑索引:
I = A > 0.7;
A(I) = A(I)*2;
A(~I) = A(~I) - 5;
这也是完全矢量化的。