我有大型数组,我正在做相当简单的线性代数。我通过矢量化操作实现了很好的加速,但我想知道MATLAB如何处理子阵列。
我预先分配数组,因为它们用于各种操作,我的公式很长,需要许多不同的数组和子数组,因此在我编码时可读性很重要。
例如,一个简单的案例:
Array = someBig2DArray;
soln = Array;
[len_x len_y] = size(Array);
A1 = Array(2:len_x-1, 2:len_y-1);
A2 = Array(1:len_x-2, 2:len_y-1);
A3 = Array(3:len_x, 2:len_y-1);
soln(2:len_x-1, 2:len_y-1) = (A1 - 2*A2 + A3)/2
使用这种方法的缺点是我有3个基本相同大小的额外数组占用内存。
可替换地:
soln(2:len_x-1, 2:len_y-1) = (Array(3:len_x, 2:leny-1) - 2*Array(2:len_x-1, 2:len_y-1) + Array(1:len_x-2, 2:len_y-1))/2
第二种方法是否使用更少的内存,同时牺牲了可读性?或者它实际上是否创建了“临时”数组,实际上最终使用了大致相同数量的内存,但只是短暂的? (我接近我系统的极限......)
这些方法内部是否相同,谈论bigO和操作次数?
是否有任何方法可以在保持可读性的同时降低第一种方法的内存要求?
这是我代码中的一个snippit(在这种情况下实际上是1D)。我最初的想法是对for循环进行矢量化并使用matlab通常非常好的矩阵函数来加快速度。事实证明,第一种方法明显更快。为什么呢?
for i = 3:len-1
dSdx = sigma(i) - sigma(i-1) + ...
0.25*(sigma(i+1) - sigma(i) - sigma(i-1) + sigma(i-2));
ddSdx2 = sigma(i+1) - 2*sigma(i) + sigma(i-1);
sigma_new(i) = sigma(i) + dT*(kappa*ddSdx2/h^2 - U*dSdx/h);
end
%This section replaces the for loop above
dSdx = sigma(3:len-1) - sigma(2:len-2) + 0.25*(sigma(4:len) ...
- sigma(3:len-1) - sigma(2:len-2) + sigma(1:len-3));
ddSdx2 = sigma(4:len) - 2*sigma(3:len-1) + sigma(2:len-2);
sigma_new(3:len-1) = sigma(3:len-1) + dT*(kappa*ddSdx2/h^2 - U*dSdx/h);
答案 0 :(得分:2)
您可以使用tic
和toc
为您的方法计时。尝试你的两种方法(有一些错别字需要修复),表明第二种方法比第一种方法慢约3.5倍。