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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:34