我正在努力提高脚本的运行速度。
这是代码:(我的机器=4核心赢7)
clear y;
n=100;
x=linspace(0,1,n);
% no y pre-allocation using zeros
start_time=tic;
for k=1:n,
y(k) = (1-(3/5)*x(k)+(3/20)*x(k)^2 -(x(k)^3/60)) / (1+(2/5)*x(k)-(1/20)*x(k)^2);
end
elapsed_time1 = toc(start_time);
fprintf('Computational time for serialized solution: %f\n',elapsed_time1);上面的代码给出了0.013654的运行时间。
另一方面,我试图通过在上面的代码中添加y = zeros(1,n);来使用预分配,其中的注释是注释,但是运行时间大约是0.0 1。知道为什么吗?有人告诉我它会提高2倍。我是不是漏掉了什么?
最后,在Matlab中有什么类型的矢量化可以让我忘记上面代码中的for循环吗?
谢谢,
发布于 2014-02-04 21:45:00
在您的代码中:尝试使用n=10000,您将看到更多的差异(在我的机器上几乎是10倍)。
当变量的大小很大时,这些与分配相关的事情是最明显的。在这种情况下,Matlab更难为该变量动态分配内存。
为了减少操作的数量:是否将操作向量化,并重用中间结果以避免权限:
y = (1 + x.*(-3/5 + x.*(3/20 - x/60))) ./ (1 + x.*(2/5 - x/20));标杆
用n=100
Parag/venergiac的解决方案:
>> tic
for count = 1:100
y=(1-(3/5)*x+(3/20)*x.^2 -(x.^3/60))./(1+(2/5)*x-(1/20)*x.^2);
end
toc
Elapsed time is 0.010769 seconds.我的解决方案:
>> tic
for count = 1:100
y = (1 + x.*(-3/5 + x.*(3/20 - x/60))) ./ (1 + x.*(2/5 - x/20));
end
toc
Elapsed time is 0.006186 seconds.发布于 2014-02-04 21:46:59
您不需要for循环。用以下代码替换for循环,MATLAB将处理它。
y=(1-(3/5)*x+(3/20)*x.^2 -(x.^3/60))./(1+(2/5)*x-(1/20)*x.^2);当向量变大时,这可能会提供计算优势。较小的大小是您看不到预分配的效果的原因。有关如何提高性能的其他技巧,请阅读这页面。
编辑:我观察到,在更大的尺寸,n>=10^6,我得到了一个不断的性能改进,当我尝试以下:
x=0:1/n:1;而不是使用linspace。在n=10^7,我通过不使用linspace获得0.05秒(0.03vs0.08)。
发布于 2014-02-04 21:52:14
尝试每个元素的操作元素(.*,.^)
clear y;
n=50000;
x=linspace(0,1,n);
% no y pre-allocation using zeros
start_time=tic;
for k=1:n,
y(k) = (1-(3/5)*x(k)+(3/20)*x(k)^2 -(x(k)^3/60)) / (1+(2/5)*x(k)-(1/20)*x(k)^2);
end
elapsed_time1 = toc(start_time);
fprintf('Computational time for serialized solution: %f\n',elapsed_time1);
start_time=tic;
y = (1-(3/5)*x+(3/20)*x.^2 -(x.^3/60)) / (1+(2/5)*x-(1/20)*x.^2);
elapsed_time1 = toc(start_time);
fprintf('Computational time for product solution: %f\n',elapsed_time1);我的数据
序列化解决方案的计算时间: 2.578290 序列化解决方案的计算时间: 0.010060
https://stackoverflow.com/questions/21564052
复制相似问题