我有一个巨大的矩阵。我刚刚给出了一个具有大小的矩阵的示例(1*1000000).
我正在使用简单Loop
(我不喜欢使用Loop
)来找到k
. where
k= k(ii)=(abs(a(ii+1)-2*a(ii)+a(ii-1)))/(a(ii+1)+2*a(ii)+a(ii-1))
然而,这对于小矩阵来说是没问题的。如果我有大量数据,那将需要很长时间。有没有办法用向量代替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
如果你想对其进行矢量化,你需要知道哪些索引a
您将在每次迭代中使用。例如,术语a(ii+1)
with ii
迭代自2
to 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
比矢量化的快得多。您遇到的性能下降是由于以下原因造成的预分配 (as 克里斯·卢恩戈已经建议)。要预分配,请编写k = zeros(1, size(a,2)-1);
在循环之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)