首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预分配与矢量化加速

预分配与矢量化加速
EN

Stack Overflow用户
提问于 2014-02-04 21:39:31
回答 3查看 213关注 0票数 2

我正在努力提高脚本的运行速度。

这是代码:(我的机器=4核心赢7)

代码语言:javascript
复制
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循环吗?

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-04 21:45:00

在您的代码中:尝试使用n=10000,您将看到更多的差异(在我的机器上几乎是10倍)。

当变量的大小很大时,这些与分配相关的事情是最明显的。在这种情况下,Matlab更难为该变量动态分配内存。

为了减少操作的数量:是否将操作向量化,并重用中间结果以避免权限:

代码语言:javascript
复制
y = (1 + x.*(-3/5 + x.*(3/20 - x/60))) ./ (1 + x.*(2/5 - x/20));

标杆

n=100

Parag/venergiac的解决方案:

代码语言:javascript
复制
>> 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.

我的解决方案:

代码语言:javascript
复制
>> 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.
票数 3
EN

Stack Overflow用户

发布于 2014-02-04 21:46:59

您不需要for循环。用以下代码替换for循环,MATLAB将处理它。

代码语言:javascript
复制
y=(1-(3/5)*x+(3/20)*x.^2 -(x.^3/60))./(1+(2/5)*x-(1/20)*x.^2);

当向量变大时,这可能会提供计算优势。较小的大小是您看不到预分配的效果的原因。有关如何提高性能的其他技巧,请阅读页面。

编辑:我观察到,在更大的尺寸,n>=10^6,我得到了一个不断的性能改进,当我尝试以下:

代码语言:javascript
复制
x=0:1/n:1;

而不是使用linspace。在n=10^7,我通过不使用linspace获得0.05秒(0.03vs0.08)。

票数 2
EN

Stack Overflow用户

发布于 2014-02-04 21:52:14

尝试每个元素的操作元素(.*.^)

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21564052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档