【问题标题】:Octave/Matlab vectorization of for-loop with function带有函数的 for 循环的 Octave/Matlab 向量化
【发布时间】:2016-10-07 18:02:50
【问题描述】:

我有一个函数,它有一个向量作为输入,我想用上一步的输出对每个元素应用一个函数。我已经实现了一个 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 循环的矢量化方法。

【问题讨论】:

  • 你需要矢量化procAcc,而不是myFunc

标签: matlab function octave vectorization


【解决方案1】:

在这种情况下,您不能使用“矢量化”,因为元素 i 的计算取决于元素 i-1。你的计算必须被链接起来。而是尝试使用函数式方法——“mapreduce”是一个强大的概念,适用于各种情况。 Octave 中似乎没有原生函数,但this 答案引用了一个提供reduce 函数的包。如果你使用它,for 循环应该被替换成这样的:

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

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

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2014-05-16
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多