我需要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。在這裏,我可以Z
和p
提供新的示例數據,然而,在這個例子中它工作得很好,因爲我是不是能夠重新帶來錯誤的例子:
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行之前)?
'?try'或'?tryCatch' – rawr
從問題目前尚不清楚這是否是一個數學問題,而不是編程之一。如果要反轉的奇異矩陣是一箇中間結果,那麼可能有一個不同的公式可以避免「被零除」?因爲如果奇點無法避免,問題就是固有的,問題應該重新制定更廣泛或準確性增加等等,這取決於。 –
當你傳遞一個矩陣到'solve'時,你告訴它找到逆矩陣,但奇異矩陣不具有逆矩陣。我想你是在問它做不可能的事情.... – Jthorpe