首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何求解奇异矩阵?

如何求解奇异矩阵?
EN

Stack Overflow用户
提问于 2015-11-06 19:17:50
回答 2查看 11K关注 0票数 0

我需要在一个列表中solve超过上千个矩阵。但是,我得到了错误Lapack routine dgesv: system is exactly singular。我的问题是,我的输入数据是非奇异矩阵,但是在对这些矩阵进行计算之后,其中一些得到了奇异。但是,一个包含数据子集的可重复的示例是不可能的,因为它会很长(我已经尝试过了)。这里是我问题的一个基本例子(A是经过一些计算后的矩阵,R是我需要做的下一个计算):

代码语言:javascript
运行
复制
A=matrix(c(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), nrow=4)
R = solve(diag(4)-A)

你有什么想法如何“解决”这个问题,也许其他功能?或者如何对奇异矩阵进行非常微小的变换,以避免产生完全不同的结果?谢谢

编辑:,根据@Roman,我包含了我必须做的函数(包括所有计算):

代码语言:javascript
运行
复制
function(Z, p) {
  imp <- as.vector(cbind(imp=rowSums(Z)))
  exp <- as.vector(t(cbind(exp=colSums(Z))))
  x = p + imp
  ac = p + imp - exp  
  einsdurchx = 1/as.vector(x)    
  einsdurchx[is.infinite(einsdurchx)] <- 0
  A = Z %*% diag(einsdurchx)
  R = solve(diag(length(p))-A) %*% diag(p)    
  C = ac * einsdurchx
  R_bar = diag(as.vector(C)) %*% R
  rR_bar = round(R_bar)
  return(rR_bar)
}

问题在计算solve(diag(length(p))-A)的函数的第8行中。在这里,我可以为Zp提供新的示例数据,但是在这个示例中它工作得很好,因为我无法重新创建一个导致错误的示例:

代码语言:javascript
运行
复制
p = c(200, 1000, 100, 10)
Z = matrix(
  c(0,0,100,200,0,0,0,0,50,350,0,50,50,200,200,0),
  nrow = 4, 
  ncol = 4,
  byrow = T) 

所以,@Roman的问题是:是否有一种方法来改变之前的计算,使det(diag(length(p))-A)永远不会得到0,以便solve方程?我希望你能理解我想要的:)想法,谢谢。Edit2:可能更容易问:如何避免此函数中的奇点(至少在第8行之前)?

EN

Stack Overflow用户

发布于 2016-12-10 08:25:48

R的QR分解函数可能有你的答案。它们提供了一种稳健求解线性方程组的方法。QR分解提供的不是逆,而是矩阵分解,通常可以在使用逆的情况下使用。

对于矩形矩阵,QR分解可用于求最小二乘拟合.对于平方、(近)奇异矩阵,qr()检测到这种(近)奇异性,然后可以使用qr.coef()来获得解,而不存在任何错误,但可能有一些NAs (可以转换为零)。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33574091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档