具有函数的for循环的Octave / Matlab向量化

我有一个函数,它有一个向量作为输入,我想用上一步的输出将函数应用于每个元素 . 我已经实现了for循环:

function res = myFunc(F)
if (numel(F) == 1)
    res = F(1);
    return;
end;
B = F(1);
for idx = 2:numel(F)
    B = procAcc(F(idx),B);
res = B;    
end

procAcc函数接受两个参数并产生一个输出 . 也就是说,如果输入是向量(f1,f2,f3),我首先应用函数procAcc(f1,f2),它产生一个结果(res),并在下一步中我应用函数procAcc(a3,res) )产生最终结果 . 我的问题是Matlab(或Octave)是否支持一种允许我跳过for循环的矢量化方法 .

回答(1)

3 years ago

在这种情况下,您不能使用"vectorization",因为元素 i 的计算取决于元素 i-1 . 你的计算必须链接 . 而是尝试使用功能方法 - "mapreduce"是一个强大的概念,适用于各种情况 . Octave中似乎没有本机函数,但是this answer引用了一个提供 reduce 函数的包 . 如果你使用它, for 循环应该替换为这样的东西:

res = reduce(@(x,y)(procAcc(x,y)), F);

通常mapreduce比 for 循环提供了一些性能优势,但在当前情况下,这取决于提供 reduce 函数的包的实现 .