Julia 0.6.2中对称矩阵的逆矩阵非对称问题求助
为什么Julia 0.6.2中对称矩阵的逆矩阵
issymmetric返回false,而Matlab返回true? 这是个很典型的数值计算精度问题,再加上Julia和Matlab在对称判断逻辑上的差异导致的,咱们来详细说清楚:
核心背景:理论 vs 数值计算
首先明确:理论上,对称可逆矩阵的逆矩阵一定是对称的——因为如果$A$对称,那么$(A{-1})T = (AT){-1} = A^{-1}$。但问题出在数值计算的浮点误差上:矩阵求逆涉及大量的加减乘除和浮点运算,过程中会产生微小的舍入误差,这些误差会让逆矩阵的元素在浮点精度下不完全严格对称。
Julia和Matlab的差异点
1. issymmetric的判断逻辑不同
- Julia 0.6.2的
issymmetric:这个版本的函数是严格比较矩阵的每个元素与其转置位置的元素是否完全相等。哪怕两个元素的差异只有$10^{-16}$量级(远小于日常计算的精度要求),只要不相等,就会返回false。 - Matlab的
issymmetric:默认会考虑浮点计算的容差,它内部会检查矩阵与其转置的差的范数是否小于一个基于机器精度的阈值(类似eps * norm(A))。只要差异在这个可接受的范围内,就会返回true。
2. 验证这个差异
你可以在Julia里手动验证逆矩阵的对称差异:
mat = zeros(6, 6) for i = 1 : 6 for j = 1 : 6 mat[i, j] = exp(-(i - j)^2) end end inv_mat = inv(mat) # 计算对称元素的最大差异 max_diff = maximum(abs.(inv_mat - inv_mat')) println(max_diff) # 输出大概是1e-16左右的极小值
这个极小的差异就是浮点误差导致的,Julia 0.6.2的issymmetric因为严格比较,所以返回false;而Matlab会忽略这种量级的误差,返回true。
3. Julia的解决方案(针对0.6.2版本)
如果你想在Julia 0.6.2里实现类似Matlab的判断逻辑,可以手动检查矩阵与其转置的差是否在可接受的精度范围内:
function is_symmetric_with_tol(A, tol=1e-12) return norm(A - A') < tol end is_symmetric_with_tol(inv_mat) # 这个会返回true
在Julia 1.x及以后的版本中,issymmetric已经支持atol参数,直接用issymmetric(inv_mat, atol=1e-12)就可以得到和Matlab一致的结果。
总结
- 理论上对称矩阵的逆必然对称,但数值计算的浮点误差会打破严格对称;
- Julia 0.6.2的
issymmetric是严格元素相等判断,而Matlab默认使用容差判断,这是结果差异的核心原因; - 通过手动添加容差判断,可以在Julia中得到和Matlab一致的结论。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

