我在MatLab上运行仿真时遇到了一些数值问题。请在这里找到问题:
-
我发现
A*A'
(一个矩阵乘以它的转置)在MatLab中不保证是对称的。我能知道是什么原因吗?因为我有A*C*A'
,其中C
是一个对称矩阵,我想让A*C*A'
保持对称。有什么方法可以修正转置运算产生的数值差异吗? -
我在Matlab中实现了一个for循环来计算一组矩阵。每一轮的数值差异(
10^(-10)
左右)会累积到下一轮,最后在30轮左右出现分歧。有什么方法可以修复每次运行时的小错误,同时又不影响结果吗?
感谢您阅读我的问题!
我发现A*A'(一个矩阵乘以它的转置)在MatLab中不保证是对称的。
我不同意书面的说法。MATLAB解析器足够聪明,可以识别A*A'的操作数是相同的,并在后台调用对称的BLAS例程来完成工作,然后手动将一个三角形复制到另一个三角形中,从而产生完全对称的结果。通常遇到麻烦的地方是编写解析器无法识别的代码。例如,
A = whatever;
B = whatever;
X = A + B;
(A+B) * (A+B)' <-- MATLAB parser will call generic BLAS routine
X * X' <-- MATLAB parser will call symmetric BLAS routine
在上面的第一个矩阵乘法中,MATLAB解析器可能不够聪明,无法识别对称性,因此可以调用通用矩阵乘法BLAS例程(例如,dgemm)来完成工作,并且不能保证结果完全对称。但是在上面的第二个矩阵乘法中,MATLAB解析器识别对称性并调用对称BLAS矩阵乘法例程。
对于ACA'的情况,我不知道有任何方法可以强制MATLAB生成精确的对称结果。您可以手动将一个生成的三角形复制到另一个三角形中。我想你也可以把C分解成两个部分X*X',然后重新组合,但这对你想做的事情来说似乎工作量太大了。