2015-11-06 228 views
0

我需要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苏西我包括函数(所有的计算)我必须做的:

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) 

所以,问题3.根据@Roman王莲香是:有没有办法在改变计算之前让det(diag(length(p))-A)永远不会得到0以便solve的方程式?我希望你能理解我想要的:)想法,谢谢。 编辑2:也许问得更简单:如何避免此功能中的奇点(至少在第8行之前)?

+0

'?try'或'?tryCatch' – rawr

+0

从问题目前尚不清楚这是否是一个数学问题,而不是编程之一。如果要反转的奇异矩阵是一个中间结果,那么可能有一个不同的公式可以避免“被零除”?因为如果奇点无法避免,问题就是固有的,问题应该重新制定更广泛或准确性增加等等,这取决于。 –

+0

当你传递一个矩阵到'solve'时,你告诉它找到逆矩阵,但奇异矩阵不具有逆矩阵。我想你是在问它做不可能的事情.... – Jthorpe

回答

1

在MASS包可以处理奇异矩阵,但是否有意义或不适合您的问题将不得不被确定的广义逆ginv

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

,并提供:

 [,1] [,2] [,3] [,4] 
[1,] 0 0 0 0 
[2,] 0 0 0 0 
[3,] 0 0 0 0 
[4,] 0 0 0 0 

还有在ibdreg包Ginv功能。

+0

这不是一般意义上的逆向 - 只是一个编程方便/不便(我总是宁愿有一个错误,而不是一个可能有意义或无意义的答案!) – Jthorpe

+0

......或者“是否它使意义还是不意味着必须超定“。对不起,无法抗拒。 –

+0

他!他!他!他! –

0

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

对于矩形矩阵的QR分解,可以用来寻找最小平方拟合。对于正方形,(近)奇异矩阵,qr()检测这个(近)奇异,然后qr.coef()可以用来获得没有任何错误,但有可能某些NAS(其可以被转换成零)的溶液中。