Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 因为循环需要很长时间_Performance_Matlab_For Loop - Fatal编程技术网

Performance 因为循环需要很长时间

Performance 因为循环需要很长时间,performance,matlab,for-loop,Performance,Matlab,For Loop,我在模拟一个100万个重复的欧文霍尔分布,每个重复是100个均匀随机变量的总和。我创建了这个程序,我认为它是正确的,但是MATLAB已经运行了一整晚,还没有完成,所以有一些明显的错误,但我看不出在哪里。这是我的程序,我希望有人能看到这个问题 n=100; % Nb of samples N=1000000; %Nb of replicates for jj=1:N for ii=1:n x(ii)=rand(); end s(jj)=sum(x);

我在模拟一个100万个重复的欧文霍尔分布,每个重复是100个均匀随机变量的总和。我创建了这个程序,我认为它是正确的,但是MATLAB已经运行了一整晚,还没有完成,所以有一些明显的错误,但我看不出在哪里。这是我的程序,我希望有人能看到这个问题

n=100; % Nb of samples
N=1000000; %Nb of replicates

for jj=1:N
    for ii=1:n
        x(ii)=rand();
    end
    s(jj)=sum(x);
    mu=mean(s);
    sigma2=var(s);
    sigma=std(s);
    S(jj)=1-normcdf((70-mu)/sigma);
    if mod(jj, 100000)==0
        jj
    end
end

histogram(S) 
这段代码在我的i5-750处理器上使用N=1e4运行了半秒钟

最重要的是:不要打印到像jj这样的控制台。或者根本不打印,或者为了清晰起见使用disp命令。打印到控制台需要很多时间。而且在循环中增加变量需要很长时间。每次增加变量的长度(这里是一百万倍),都会强制MATLAB首先创建一个初始长度为+1的变量,然后复制内容,然后删除旧变量。这可能就是代码花费这么长时间的原因

我还使用了一个临时变量tmp,使代码中的转换稍微容易一些

这段代码在我的i5-750处理器上使用N=1e4运行了半秒钟

最重要的是:不要打印到像jj这样的控制台。或者根本不打印,或者为了清晰起见使用disp命令。打印到控制台需要很多时间。而且在循环中增加变量需要很长时间。每次增加变量的长度(这里是一百万倍),都会强制MATLAB首先创建一个初始长度为+1的变量,然后复制内容,然后删除旧变量。这可能就是代码花费这么长时间的原因

我还使用了一个临时变量tmp,使代码中的转换稍微容易一些。

我预先分配了变量S,并对一些代码进行了矢量化

tic;

n=100; % Nb of samples
N=1000000; %Nb of replicates

x = rand(n,N); % x(ii) = rand();
s = sum(x); % s = sum(x);
mu = cumsum(s)./(1:N); % mu = mean(s);

S = zeros(N,1);
for jj=1:N
    sigma=std(s(1:jj));
    S(jj)=1-normcdf((70-mu(jj))/sigma);
    if ~mod(jj,100000)
        fprintf('%d %.2f\n',jj,toc);
    end
end

toc

histogram(S)  
我明白了

N        orginal  modified
----------------------------
1e+05     54.07      31.9
2e+05    246.37     173.6
3e+05    621.06    450.91
4e+05    1161.2    835.03
5e+05    1837.5    1329.4
6e+05    2661.4    1930.3
配备i5-6200U处理器和8GB DDR3 RAM

由于jj越大,计算越重,因此如果运行N=10^6的代码,将需要相当长的时间

因为您没有预先分配变量,所以设置N越大,差异越大

尽管MATLAB可以处理可变大小的修改,但MATLAB强烈建议您预先分配内存。每次MATLAB到达变量的边界时,MATLAB都会尝试重新分配内存,这需要更多的时间。即使无法计算出确切的内存大小,也最好先粗略地猜测一些变量,然后删除循环后未使用的部分。

我预先分配了变量,并对一些代码进行了矢量化

tic;

n=100; % Nb of samples
N=1000000; %Nb of replicates

x = rand(n,N); % x(ii) = rand();
s = sum(x); % s = sum(x);
mu = cumsum(s)./(1:N); % mu = mean(s);

S = zeros(N,1);
for jj=1:N
    sigma=std(s(1:jj));
    S(jj)=1-normcdf((70-mu(jj))/sigma);
    if ~mod(jj,100000)
        fprintf('%d %.2f\n',jj,toc);
    end
end

toc

histogram(S)  
我明白了

N        orginal  modified
----------------------------
1e+05     54.07      31.9
2e+05    246.37     173.6
3e+05    621.06    450.91
4e+05    1161.2    835.03
5e+05    1837.5    1329.4
6e+05    2661.4    1930.3
配备i5-6200U处理器和8GB DDR3 RAM

由于jj越大,计算越重,因此如果运行N=10^6的代码,将需要相当长的时间

因为您没有预先分配变量,所以设置N越大,差异越大


尽管MATLAB可以处理可变大小的修改,但MATLAB强烈建议您预先分配内存。每次MATLAB到达变量的边界时,MATLAB都会尝试重新分配内存,这需要更多的时间。即使您无法计算出确切的内存大小,也最好先粗略猜测一些变量,然后在循环后删除未使用的部分。

分区/s igma中的空间真的存在吗?还有,为什么不只是x=100,1;100万次迭代将需要大量时间!!还考虑内存的X,S,S,以节省一些时间!/s igma已更正,但问题仍然存在:@Orongo为什么您将我的代码复制到问题本身,但对Dohyun的答案留下了评论?请不要复制我的代码,而是在我的答案上的注释中解释,因为这就是你从不清楚的地方得到这个代码的原因。我将回滚您所做的编辑,因为我和Dohyun的答案对当前问题都没有任何意义。您的部门/s igma中的空间真的存在吗?还有,为什么不只是x=100,1;100万次迭代将需要大量时间!!还考虑内存的X,S,S,以节省一些时间!/s igma已更正,但问题仍然存在:@Orongo为什么您将我的代码复制到问题本身,但对Dohyun的答案留下了评论?请不要复制我的代码,而是在我的答案上的注释中解释,因为这就是你从不清楚的地方得到这个代码的原因。我将回滚您所做的编辑,因为我和Dohyun的答案对当前问题都没有意义。速度很快!不过,那个节目看起来很可疑原则上,我会根据var计算std,而不是再次基于数据。@DennisJaheruddin我对原始代码中存在唯一的jj感到相当惊讶。我怀疑他想要某种进度表,所以我给他打了个电话叫disp,这就是我给他的原因。我理解你为什么要这样做,但这个电话似乎不起作用。@DennisJaheruddin hehe,是的,我忘了跳过一句话。省略了are的缩短,并以这种方式固定。好的接球手,好的速度!不过,那个节目看起来很可疑原则上我会计算s
td基于var,而不是再次基于数据。@DennisJaheruddin我对原始代码中存在唯一的jj感到相当惊讶。我怀疑他想要某种进度表,所以我给他打了个电话叫disp,这就是我给他的原因。我理解你为什么要这样做,但这个电话似乎不起作用。@DennisJaheruddin hehe,是的,我忘了跳过一句话。省略了are的缩短,并以这种方式固定。好的捕手,这是非常好的了解,将派上用场。运行了6个小时,结果和代码现在在问题行中。我对结果感到有点惊讶,因为这是一个学习练习,我对结果和运行时间感到惊讶,因为它们都非常普通。知道这一点很好,会很有用的。运行了6个小时,结果和代码现在在问题行中。我对结果感到有点惊讶,因为这是一个学习练习,我对结果和运行时间感到惊讶,因为它们都非常普通。