我知道解决矩阵问题的简单方法
是 LU 分解
因此我在matlab中实现了以下代码:
r_num = 10000;
r_rounds = 10000;
A = -30*sparse(diag(ones(r_num,1),0))+16*sparse(diag(ones(r_num-1,1),1))+16*sparse(diag(ones(r_num-1,1),-1))-sparse(diag(ones(r_num-2,1),-2))-sparse(diag(ones(r_num-2,1),2));
b = rand(r_num,1);
tic;
for i = 1:r_rounds
c1 = A\b;
end
toc;
tic;
[L, U] = lu(A);
for i = 1:r_rounds
y = L\b;
end
toc;
tic;
for i = 1:r_rounds
c2 = U\y;
end
toc;
我已经知道了正在后台进行 LU 分解,但我仍然对结果感兴趣。现在我的脚本返回了计算几乎和直接计算一样昂贵,而计算非常快。但差异从何而来?还是我的测量方法有缺陷?
当分别计时 LU 分解时,我得到
A\b
Elapsed time is 13.380155 seconds.
lu(A)
Elapsed time is 0.002662 seconds.
y=L\b
Elapsed time is 10.557989 seconds.
c2=U\y
Elapsed time is 1.229101 seconds.
单独计时 LU 分解的原因(在循环之外)是因为对于我以后的应用程序,我将不得不处理一个常量, 但变化量很大-价值观。因此,我尝试将循环中的元素数量保持在尽可能低的水平。