首页 > 解决方案 > Matlab中迭代后的数值问题

问题描述

我在 MatLab 上运行仿真时遇到了一些数值问题。在这里请找到问题:

  1. 我发现A*A' (矩阵乘以它的转置)在 MatLab 中不能保证是对称的。我能知道是什么原因吗?而且因为我将有A*C*A',其中C是一个对称矩阵,我想保持A*C*A'对称。有什么方法可以修复转置操作产生的数值差异吗?

  2. 我在 Matlab 中实现了一个 for 循环来计算一组矩阵。10^(-10)每轮中的小数值差异(大约)累积到下一次运行,并在大约 30 轮后最终发散。有什么方法可以修复每次运行中的小错误,同时不影响结果。

感谢您阅读我的问题!

标签: matlabnumeric

解决方案


“我发现 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 矩阵乘法例程。

对于 A C A' 案例,我不知道有任何方法可以强制 MATLAB 生成精确的对称结果。您可以在事后手动将一个生成的三角形复制到另一个。我想您也可以将 C 分解为 X*X' 两部分,然后重新组合,但这对于您正在尝试做的事情来说似乎工作量太大。


推荐阅读