如何解决奇异矩阵?

时间:2015-11-06 19:17:50

标签: r matrix singular

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

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 Susi我要包含我必须做的功能(包括所有计算):

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提供新的示例数据,但是在此示例中它工作正常,因为我无法重新创建带来错误的示例:

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 Susi的问题是:有没有办法改变计算,以便det(diag(length(p))-A)永远不会得到0以便solve等式?我希望你能理解我想要的东西:)想法,谢谢。 Edit2:可能更容易被问到:如何避免此功能中的奇点(至少在第8行之前)?

2 个答案:

答案 0 :(得分:3)

MASS包中的广义逆foreach可以处理奇异矩阵,但是对于你的问题是否有意义则必须确定。

ginv

,并提供:

 library(MASS)
 ginv(diag(4) - A)

ibdreg包中还有 [,1] [,2] [,3] [,4] [1,] 0 0 0 0 [2,] 0 0 0 0 [3,] 0 0 0 0 [4,] 0 0 0 0 函数。

答案 1 :(得分:0)

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

对于矩形矩阵,QR分解可用于找到最小二乘拟合。对于方形(近)奇异矩阵,qr()检测到这个(近)奇点,然后qr.coef()可用于获得没有任何错误但可能有一些NA(可以转换为零)的解决方案