gpt4 book ai didi

performance - Matlab 代码优化和去除循环

转载 作者:行者123 更新时间:2023-12-03 17:14:16 24 4
gpt4 key购买 nike

这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the help center .




10年前关闭。




我不能自己删除这个循环,如果有人可以帮助我优化这段代码 - 欢迎。

M = length(w);
expt = exp(-t .* (phis * w'));
G = zeros(M, M);
for i = 1 : M
for j = 1 : M
last = 2 * reg_coef * eye(M);
G(i,j) = last(i, j) + mean(expt .* t .^2 .* phis(:,i) .* phis(:,j) ./ (1 + expt) .^ 2);
end
end
  • w - 尺寸为 (1xM)
  • 个人信息 - 大小为 (NxM)
  • 电话 - 大小为 (Nx1)
  • 最佳答案

    通过编写更简洁的代码,您可以做得更好 - 确保正确分配,确保从循环中删除重复计算等:

    编辑:您还可以看到生成的矩阵 G是对称的,所以你会立即得到 2x通过仅计算上三角形并随后将下三角形填充为转置来加速。

    至少我的 MATLAB通过矢量化对 mean() 的调用实现了另一个很大的加速。通过使用临时数组。

    N = 100;
    M = 100;

    w = rand(1,M);
    t = rand(N,1);
    phis = rand(N,M);
    reg_coeff = rand(1,1);

    expt = exp(-t .* (phis * w'));

    %% Initial version
    tic
    for i = 1 : M
    for j = 1 : M
    last = 2 * reg_coeff * eye(M,M);
    G1(i,j) = last(i,j) + mean(expt .* t .^ 2 .* phis(:,i) .* phis(:,j) ./ (1 + expt) .^ 2);
    end
    end
    t1 = toc;

    %% Faster version
    tic
    coeff = expt .* t .^ 2 ./ (1 + expt) .^ 2;
    G2 = zeros(M,M);
    TT = zeros(M,M);
    for i = 1 : M
    for j = i : M % only form upper triangle
    TT(:,j) = coeff .* phis(:,i) .* phis(:,j);
    end
    G2(i,i:M) = mean(TT(:,i:M),1); % vectorise call to mean()
    end
    G2 = 2 * reg_coeff * eye(M,M) + G2 + triu(G2,+1)';
    t2 = toc;

    %% Compare versions
    speed = t1/t2
    error = max(max(abs(G2 - G1)))

    为此 100x100如果加速在 41.0 左右在我的机器上。

    希望这可以帮助。

    关于performance - Matlab 代码优化和去除循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7184293/

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