我需要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