【问题标题】:Replace two for loops using vectorization?使用矢量化替换两个 for 循环?
【发布时间】:2021-10-25 15:20:11
【问题描述】:

我有一个函数 f(x,y) = abs(cos(x+3) * sin(y+2)),我需要使用两个 for 循环对其进行总结。注意:真正的功能更复杂,这是一个玩具版本的问题。

f = @(x,y) abs(cos(x+3) * sin(y+2));

tot = 0;
for m=1:100
    for n=1:100
        tot = tot + f(m,n);
    end
end

disp(tot)

Output: 4.026314876227891e+03

如何对这段代码进行矢量化以摆脱 for 循环并使其更快?

【问题讨论】:

    标签: matlab vectorization


    【解决方案1】:
    [n,m]=meshgrid(1:100,1:100);
    tot=sum(f(m,n),'all')
    

    但是我不确定这是否更快,您可以计时。 Matlab 的循环速度非常快,关于循环速度较慢的古老事实已经过时了 5 年左右。大多数时候,JIT 编译器会找到最快的方式来运行它。这是您的玩具问题可能隐藏实际问题的情况之一,因为 JIT 可能会发现这个玩具问题更容易加速,但不是您真正的问题,反之亦然。

    你需要时间。

    【讨论】:

    • 为这个解决方案添加一个细节:要使矢量化工作,必须正确实现函数f。 OP 的定义会导致昂贵的矩阵-矩阵乘法(产生不希望的结果),而实际所需的计算使用逐点乘法:f = @(x,y) abs(cos(x+3) .* sin(y+2));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2017-07-22
    • 2020-12-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多