2015-11-06 680 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(其可以被轉換成零)的溶液中。