我怎么能在Matlab中执行像List comprehension这样的东西?

时间:2013-07-05 06:08:31

标签: matlab list-comprehension

我的问题是:我怎样才能在Matlab中执行类似于Haskell或Python的List comprehension? 要完成Matlab中的功能,如下所示:

for xxx 
    if condition
        expression1;    
    else 
        expression2;
     end 
end 

我最初的目标是利用向量化操作并减少代码中的for循环,使其运行得更快。

编辑:我希望答案没有必要与arrayfun相关的东西,更喜欢vectoried操作方法。

还有另一个与此问题相关的问题(通过名为“arrayfun”的函数)。 Matlab中的匿名函数只有1行,那我怎么能在其中写if-else表达式呢?

谢谢大家~~

2 个答案:

答案 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;

这也是完全矢量化的。