使用vector而不是Loop

时间:2018-05-19 01:32:21

标签: matlab loops matrix

我有一个巨大的矩阵。我刚刚给出了一个大小为(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

1 个答案:

答案 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 在循环之前。