【发布时间】:2011-05-08 05:47:33
【问题描述】:
我有大型数组,我正在做相当简单的线性代数。我通过向量化操作实现了很好的加速,但我想知道 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 和操作数?
有什么方法可以减少第一种方法的内存需求,同时保持可读性?
这是我的代码中的一个片段(在这种情况下实际上是 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);
【问题讨论】:
标签: performance matlab memory-management big-o arrays