如何在R语言中求解线性代数方程组的转换矩阵?
问题
我有如下矩阵形式的线性方程组,想要得到预期的输出结果,但尝试用ginv函数(比如mat1 %*% MASS::ginv(u1))无效,想知道是使用方式有误还是其他原因?
示例1
原方程组矩阵:
# 对应方程:2x+2y+2z;0x+0y+1z mat1 <- matrix(c(2, 2, 2, 0, 0, 1), 2, byrow = TRUE)
目标向量(想要得到的线性组合):
# 对应x+y+z u1 <- matrix(c(1,1,1), 1, byrow=TRUE)
预期输出:
exp1 <- matrix(c(0.5,0), 2, byrow=TRUE)
示例2
原方程组矩阵:
# 对应方程:1x+1y+1z;0x+1y+0z mat2 <- matrix(c(1, 1, 1, 0, 1, 0), 2, byrow = TRUE)
目标向量(想要得到的线性组合):
# 对应x+z u2 <- matrix(c(1,0,1), 1, byrow=TRUE)
预期输出:
exp2 <- matrix(c(1,-1), 2, byrow=TRUE)
解决方案
你的问题出在ginv的使用逻辑上:我们需要找到系数向量k(即预期输出),使得k %*% mat = u——也就是把原方程组的行向量线性组合后得到目标向量u。你之前的写法mat %*% ginv(u)颠倒了矩阵乘法顺序,逻辑完全错误。
正确思路是求解线性方程组k %*% mat = u,等价于t(mat) %*% t(k) = t(u),可以用广义逆或solve函数处理,具体实现如下:
示例1实现
library(MASS) mat1 <- matrix(c(2, 2, 2, 0, 0, 1), 2, byrow = TRUE) u1 <- matrix(c(1,1,1), 1, byrow=TRUE) # 转换为转置形式求解,再转置回原格式 k1 <- t(MASS::ginv(t(mat1)) %*% t(u1)) k1 # 输出结果: # [,1] # [1,] 0.5 # [2,] 0.0
示例2实现
mat2 <- matrix(c(1, 1, 1, 0, 1, 0), 2, byrow = TRUE) u2 <- matrix(c(1,0,1), 1, byrow=TRUE) k2 <- t(MASS::ginv(t(mat2)) %*% t(u2)) k2 # 输出结果: # [,1] # [1,] 1 # [2,] -1
如果矩阵t(mat)是列满秩的,也可以直接用solve函数简化写法:
# 示例1的简化写法 k1 <- t(solve(t(mat1), t(u1)))
但solve在矩阵非满秩时会报错,这时候ginv的广义逆处理更稳定。
内容的提问来源于stack exchange,提问作者one
相关产品推荐
相关产品推荐

