matlab 快速,MATLAB快速(分量)矢量操作……非常快

我从一段时间以来一直在编写MATLAB脚本,但是,我仍然不明白它是如何工作的“引擎盖下”.考虑以下脚本,使用(大)向量以三种不同的方式进行一些计算:

> MATLAB矢量运算;

>简单的循环,以组件方式执行相同的计算;

>一个优化的循环,应该比2快.因为避免了一些分配和一些分配.

这是代码:

N = 10000000;

A = linspace(0,100,N);

B = linspace(-100,100,N);

C = linspace(0,200,N);

D = linspace(100,200,N);

% 1. MATLAB Operations

tic

C_ = C./A;

D_ = D./B;

G_ = (A+B)/2;

H_ = (C_+D_)/2;

I_ = (C_.^2+D_.^2)/2;

X = G_ .* H_;

Y = G_ .* H_.^2 + I_;

toc

tic

X;

Y;

toc

% 2. Simple cycle

tic

C_ = zeros(1,N);

D_ = zeros(1,N);

G_ = zeros(1,N);

H_ = zeros(1,N);

I_ = zeros(1,N);

X = zeros(1,N);

Y = zeros(1,N);

for i = 1:N,

C_(i) = C(i)/A(i);

D_(i) = D(i)/B(i);

G_(i) = (A(i)+B(i))/2;

H_(i) = (C_(i)+D_(i))/2;

I_(i) = (C_(i)^2+D_(i)^2)/2;

X(i) = G_(i) * H_(i);

Y(i) = G_(i) * H_(i)^2 + I_(i);

end

toc

tic

X;

Y;

toc

% 3. Opzimized cycle

tic

X = zeros(1,N);

Y = zeros(1,N);

for i = 1:N,

X(i) = (A(i)+B(i))/2 * (( C(i)/A(i) + D(i)/B(i) ) /2);

Y(i) = (A(i)+B(i))/2 * (( C(i)/A(i) + D(i)/B(i) ) /2)^2 + ( (C(i)/A(i))^2 + (D(i)/B(i))^2 ) / 2;

end

toc

tic

X;

Y;

toc

我知道人们总是试图对计算进行矢量化,因为MATLAB构建在矩阵/向量上(因此,现在,它并不总是最好的选择),所以我期待的是:

C = A .* B;

比以下更快:

for i in 1:N,

C(i) = A(i) * B(i);

end

我没想到的是,即使在上面的脚本中它实际上更快,尽管我使用的第二和第三种方法只经过一个循环,而第一种方法执行许多向量操作(理论上,它是“for” “每次循环”.这迫使我得出结论,MATLAB有一些魔力允许(例如):

C = A .* B;

D = C .* C;

比单个“for”循环运行得更快,其中包含一些操作.

所以:

>什么是避免第一部分如此快速执行的魔力?

>当你写“D = A. * B”时,MATLAB实际上是用“for”循环进行分量计算,还是只是跟踪D包含“bla”和“bla”的乘法?

编辑

>假设我想用C实现相同的计算(可能使用某些库). MATLAB的第一种方法是否比C中实现的第三种方法更快? (我会自己回答这个问题,给我一点时间.)

编辑2

根据要求,这里有实验运行时:

第1部分:0.237143

第2部分:4.440132

其中0.195154用于分配

第3部分:2.280640

其中0.057500用于分配

没有JIT:

第1部分:0.337259

第2部分:149.602017

其中0.033886用于分配

第3部分:82.167713

其中0.010852用于分配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值