5

我的问题是:如何在 Matlab 中执行类似于 Haskell 或 Python 的列表理解?在 Matlab 中完成如下功能:

for xxx 
    if condition
        expression1;    
    else 
        expression2;
     end 
end 

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

编辑:我对答案的期望不是与arrayfun相关的东西,矢量化操作方法更受欢迎。

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

谢谢大家~~

4

2 回答 2

2

您不能if在 Matlab 中的匿名函数中使用。但是,您可以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

于 2013-07-05T06:43:24.737 回答
1

arrayfun实际上并没有摆脱循环,它只是意味着您不必显式地输入它们。也就是说,在新的 Matlabs 中循环不再那么慢了。但是可能有一种完全矢量化的方式来做你想做的事,我并不是说它一定会更快(但我认为它会在旧的 matlabs 中):

您可以利用 Matlab 自动将逻辑转换为 double 的方式,即 false 为 0,true 为 1。例如

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;

这也是完全矢量化的。

于 2013-07-05T08:11:53.627 回答