我有一个巨大的矩阵。我刚刚给出了一个大小为(1*1000000).
我使用简单的Loop
(我不想使用Loop
)来查找k
。
k= k(ii)=(abs(a(ii+1)-2*a(ii)+a(ii-1)))/(a(ii+1)+2*a(ii)+a(ii-1))
然而,对于小矩阵,这很好。如果我有大量数据需要很长时间。有没有办法使用vector而不是Loop
来查找k
?
clear;
clc;
a=rand(1,1000000);
for ii=2:size(a,2)-1
k(ii)=(abs(a(ii+1)-2*a(ii)+a(ii-1)))/(a(ii+1)+2*a(ii)+a(ii-1));
end
答案 0 :(得分:3)
如果要对其进行矢量化,则需要知道在每次迭代时将使用a
的哪些索引。例如,从a(ii+1)
到ii
重复2
的{{1}}一词意味着您使用了从索引3到最后的999999
元素同样可以找到其他条款。然后就做element wise division ./
。 a
是在开始时手动追加的,因为在您的代码中,您没有在第一个索引处显式存储任何内容,而零是跳过索引时自动存储的内容。
0
我的系统上的timeit
与R2017a和k = [0 abs(a(3:end)-2*a(2:end-1)+a(1:end-2)) ./ (a(3:end)+2*a(2:end-1)+a(1:end-2))];
的效果同步:
a=rand(1,1e8);
因此可以看出,在较新版本中,循环已得到显着改善。事实证明,具有为Orig_Post = 14.3219
Orig_Post_with_Preallocation = 1.7764
Vectorised = 5.3292
正确预先分配的内存的循环的解决方案比向量化的内存快得多。由于没有preallocation(因为Cris Luengo已经suggested),导致您遇到的性能下降。要预先分配,请写k
在循环之前。