首页 > 解决方案 > 使用向量而不是循环

问题描述

我有一个巨大的矩阵。我只是给出了一个大小矩阵的例子(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 而不是Loopfind 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

标签: matlabloopsmatrix

解决方案


如果您想对其进行矢量化,您需要知道a在每次迭代中您将使用哪些索引。例如,从到迭代的术语a(ii+1)意味着ii2正在999999使用a从索引 3 到最后的元素,并且类似地找出其他术语。然后只做元素明智的划分./0是在开始时手动附加的,因为在您的代码中,您没有在第一个索引处明确存储任何内容,而零是您跳过索引时自动存储的内容。

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))];

timeit使用 R2017a 在我的系统上计时的性能和a=rand(1,1e8);

Orig_Post = 14.3219
Orig_Post_with_Preallocation = 1.7764
Vectorised = 5.3292

因此可以看出循环在较新的版本中得到了显着改善。事实证明,具有正确预分配内存的循环的解决方案k比向量化的解决方案快得多。您遇到的性能下降是由于没有预分配(正如Cris Luengo已经建议的那样)。要预分配,k = zeros(1, size(a,2)-1); 请在循环之前写入。


推荐阅读