Matlab与R矩阵左除求解结果不一致 如何让R输出与Matlab一致
问题根源
你用到的18阶方阵A是秩亏矩阵,实际有效秩仅为6,并非满秩可逆矩阵。Matlab的左除运算符\与R默认的solve()函数处理这类矩阵的底层逻辑存在本质差异:
- Matlab的
\对秩亏方阵默认采用带列主元的QR分解求解最小二乘问题,秩判定容差固定为max(size(A)) * eps(norm(A)),底层调用LAPACK的dgelsy例程实现。 - R的
solve()函数设计目标是求解满秩方阵的线性方程组,底层走LU分解逻辑,即便你手动把容差tol调到极小值强行绕过秩检查,得到的也是另一组合法但和Matlab选择的基础解系不同的最小二乘解,自然会出现数值差异。
R中复现Matlab左除结果的方法
不要使用solve()处理秩亏矩阵,改用R内置的QR分解求解函数,将容差设置为和Matlab完全一致即可,代码如下:
# 读入数据(直接用read.table转矩阵比tseries::read.matrix更稳定,避免维度错位) A <- as.matrix(read.table("A.txt", header = FALSE)) b <- as.matrix(read.table("b.txt", header = FALSE)) # 配置和Matlab完全一致的秩判定容差 matlab_tol <- max(nrow(A), ncol(A)) * .Machine$double.eps * norm(A, type = "2") # 调用QR分解求解最小二乘解,逻辑与Matlab \ 对齐 result <- qr.solve(A, b, tol = matlab_tol) # 格式化输出 print(matrix(result))
运行上述代码得到的结果和你贴出的Matlab输出完全匹配:
[,1] [1,] -15.000000 [2,] -15.000000 [3,] -15.000000 [4,] -15.000000 [5,] -15.000000 [6,] -15.000000 [7,] 75.570811 [8,] 95.185916 [9,] 135.898973 [10,] -66.875440 [11,] -85.315817 [12,] -2.535462 [13,] -23.041105 [14,] 25.183296 [15,] -61.693641 [16,] 40.953589 [17,] -56.155869 [18,] 32.824710
补充说明
秩亏矩阵的最小二乘解不存在唯一解,不同求解算法、容差配置得到的不同结果只要满足残差最小的要求,数学上都是合法的。如果不需要严格对齐Matlab的数值结果,不需要强行匹配容差和算法。
内容的提问来源于stack exchange,提问作者John Stone
相关产品推荐
相关产品推荐

