【问题标题】:Why do I get two different inverse matrices for the same N * N matrix as N increases in Matlab?为什么在 Matlab 中随着 N 的增加,对于相同的 N * N 矩阵,我会得到两个不同的逆矩阵?
【发布时间】:2025-12-01 04:05:02
【问题描述】:

作为一个实验,我只是想看看 Cayley-Hamilton 理论和 MATLAB inv() 函数之间的计算时间。由于矩阵产品的数量,我知道 C-H 在 CPU 上会更慢,但我没想到随着 N 的增加它们会给我不同的答案。

对于小于 30 * 30 左右的方阵,逆矩阵大致相同。但是在这一点之后,它们开始彼此之间发生很大的不同。到 N = 100 时,它们完全没有相似之处。

这是一个数值计算问题,还是这里发生了其他事情? 还有我可以信任哪个?我假设inv() 是高度优化且值得信赖的,但如果能得到其他人的一些意见,那就太好了。

代码如下:

n = 100;
A = randn(n);

% MATLAB inv()

tic;
initime = cputime;
time1   = clock;
A_inv = inv(A);
fintime = cputime;
elapsed = toc;
time2   = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK:   %g\n', etime(time2, time1));

% Cayley-Hamilton inversion

tic;
initime = cputime;
time1   = clock;
p_coeff = poly(A);
A_inv_2 = 0;
for ii = 1:n-1
    A_inv_2 = A^(ii)*p_coeff(end-1-ii) + A_inv_2;
end
A_inv_2 = 1/-p_coeff(end) * (A_inv_2 + eye(n)*p_coeff(end-1));    

fintime = cputime;
elapsed = toc;
time2   = clock;
fprintf('TIC TOC: %g\n', elapsed);
fprintf('CPUTIME: %g\n', fintime - initime);
fprintf('CLOCK:   %g\n', etime(time2, time1));

感谢任何花时间回答的人。

【问题讨论】:

  • 如果我没记错的话,以数值稳定的方式计算特征多项式是很棘手的。所以我怀疑 poly() 是负责的。然而,这只是一个猜测。我正在投票,希望比我更有知识的人回答这个问题。
  • 我打赌数字问题作为解释。我记得 Noble 和 Daniel 的 Applied Linear Algebra 一书总是坚持不应该实现自己的逆运算,因为它们必然会遇到数值问题。有很多优化可以避免这些问题,inv 毫无疑问有这些优化。至于您可以信任哪个:inv,当然。在您的示例中比较 imagesc(A*A_inv)imagesc(A*A_inv_2)

标签: algorithm matlab matrix inversion


【解决方案1】:

Cayley-Hamilton 方法是一种非常不稳定的逆计算方法,因为它涉及将矩阵提升到高次幂。

考虑一个可以对角化为A=inv(P)DP 的矩阵,其中 D 是对角矩阵。当提高到 100 次方时,它变为 A^100 = inv(P) D^100 P。 D 中对角线条目之间的任何大小差异都将被此操作放大。例如,考虑 2^100 和 0.5^100 之间的差异。

实际上很容易在您的 Matlab 程序中看到这一点。打印出 A * A_inv 和 A * A_inv_2。第一个非常接近身份,而第二个包含废话:

A*A_inv_2
ans = 1.0e10 *
  0.2278  0.3500 -0.2564 ...

【讨论】:

    最近更新 更多