gpt4 book ai didi

matlab - 通过排列避免 matlab 脚本中的 'for' 循环

转载 作者:行者123 更新时间:2023-12-02 09:41:27 26 4
gpt4 key购买 nike

我的代码如下:

Ne = 100;
H = rand(Ne,Ne);
g = zeros(Ne,1);

for e =1:Ne
hue = H(:,e);
ss1 = bsxfun(@times, hue', hue) .* M; % M is a Ne*Ne matrix
g(e) = sum(ss1(:));
end

当 Ne > 1000 时,运行速度非常慢。

我阅读了matlab文档,发现排列函数是一种可能的加速方法。但我尝试了一整天,还是失败了。

这是我的代码,我不知道哪里出了问题。

C = permute(bsxfun(@times, permute(H, [1 3 2]), permute(H', [1 3 2])), [1 3 2]);
g = sum(sum(C))

最佳答案

如果你计算一下,你会发现你所要做的就是:

g = sum(H) .^ 2;

运行速度:0.000681秒,Ne = 1000(原始代码花费了3.047315秒)。

编辑:

现在,对于您编辑的代码,您所要做的就是:

g = diag(H.' * M * H);

运行速度:0.072273秒,Ne = 1000。

如果您注意到,如果重新排列项,您可以避免第二次矩阵乘法(这会变成点积),并且您所要做的就是对列求和,则可以获得加速,如下所示:

g = sum(M.' * H .* H);

运行速度:0.044190 秒,Ne = 1000。

进行数学计算总是一个好主意。我们花了一些时间,但代码获得了很好的加速。 :)

注:运行速度是通过一百次运行的平均时间来测量的。

关于matlab - 通过排列避免 matlab 脚本中的 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23002678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com