matlab - Matlab中迭代后的数值问题
问题描述
我在 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 矩阵乘法例程。
对于 A C A' 案例,我不知道有任何方法可以强制 MATLAB 生成精确的对称结果。您可以在事后手动将一个生成的三角形复制到另一个。我想您也可以将 C 分解为 X*X' 两部分,然后重新组合,但这对于您正在尝试做的事情来说似乎工作量太大。
推荐阅读
- uuid - 如何基于 JavaScript 从移动设备 PDA 获取 mac 地址或 uuid?
- vba - 使用 acNormal 运行 Docmd.OpenReport 在哪个事件中放置代码?
- javascript - 如何合并到索引数组?
- mysql - 我可以从 mysql 命令行运行 IF 语句吗?v 5.6
- reactjs - react-native 页面底部的音乐播放器
- android-studio - 用于 AMD 处理器的 Android Emulator Hypervisor 驱动程序安装失败
- kotlin - 从 CompletableFuture 返回 null 在 Kotlin 中异常阻止非 null 返回方法
- android - 您将如何解决仅在 Android 的发布模式下出现的依赖错误?
- r - 将 DF 变量转换为不在 df 中的多个字符串变量(包括代码示例)
- java - 如何修复使用 ImageIO.read [Java] [初学者] 加载纹理时出现的错误