You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:09:17