当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 优化MATLAB代码

来源:互联网 收集:自由互联 发布时间:2021-06-22
此代码需要很长时间才能运行(超过10分钟).有什么方法可以优化它,以便在不到一分钟内完成? clear all;for i = 1:1000000 harmonicsum = 0; lhs = 0; for j = 1:i % compute harmonic sum harmonicsum = harmonicsum +
此代码需要很长时间才能运行(超过10分钟).有什么方法可以优化它,以便在不到一分钟内完成?

clear all;
for i = 1:1000000
    harmonicsum = 0;
    lhs = 0;
    for j = 1:i
        % compute harmonic sum
        harmonicsum = harmonicsum + 1/j;
        % find sum of factors
        if (mod(i,j)==0)
            lhs = lhs + j;
        end
    end
    %define right hand side (rhs) of Riemann Hypothesis
    rhs = harmonicsum + log(harmonicsum) * exp(harmonicsum);

    if lhs > rhs
        disp('Hypothesis violated')
    end
end
@b3 has a great vectorization of rhs.

但是,一个错字,需要使用次数而不是时间:

harmonicsum = cumsum(1 ./ (1:1e6));
rhs = harmonicsum + log(harmonicsum) .* exp(harmonicsum);

对于lhs,我基于Eratosthenes的Sieve松散地提出以下建议:

lhs = 1 + [1:1e6];
lhs(1) = 1;
for iii = 2:numel(lhs)/2
    lhs(2*iii:iii:end) = lhs(2*iii:iii:end) + iii;
end;

执行时间仅为2.45秒(对于这个问题的一半).包括计算rhs和find的总计不到3秒.

我目前正在运行其他版本以确保结果相同.

编辑:发现了一个lhs(1)和特殊情况的错误(这是一个特例,唯一的自然数,其中1和N不是不同的因素)

网友评论