只是想知道是否有人會在 R 中共享用于 LU 分解(A = L * U)的 Crout 演算法的實作。pracma 庫中有一個 lu 函式,但使用 Doolite 代替。
> A
[,1] [,2] [,3]
[1,] -10 30 50
[2,] -6 16 22
[3,] -2 1 -5
> lu(A)
$L
[,1] [,2] [,3]
[1,] 1.0 0.0 0
[2,] 0.6 1.0 0
[3,] 0.2 2.5 1
$U
[,1] [,2] [,3]
[1,] -10 30 50
[2,] 0 -2 -8
[3,] 0 0 5
而對于 Crout 演算法,你會得到這樣的東西:
$L
[,1] [,2] [,3]
[1,] -10 0 0
[2,] -6 -2 0
[3,] -2 -5 5
$U
[,1] [,2] [,3]
[1,] 1 -3 -5
[2,] 0 1 4
[3,] 0 0 1
我一直在谷歌搜索類似的東西,但沒有在 R 中找到任何有效的實作。
謝謝!
uj5u.com熱心網友回復:
將一些 MATLAB 代碼轉換為 R 實作并不難:
LUcrout <- function(A) {
n <- nrow(A)
L <- matrix(0, n, n); U <- matrix(0, n, n)
for (i in 1:n) {
L[i, 1] <- A[i, 1]
U[i, i] <- 1
}
for (j in 2:n) {
U[1, j] <- A[1, j] / L[1, 1]
}
for (i in 2:n) {
for (j in 2:i) {
L[i, j] <- A[i, j] - L[i, 1:(j-1)] %*% U[1:(j-1), j]
}
if (i < n) {
for (j in ((i 1):n)) {
U[i, j] = (A[i, j] - L[i, 1:(i-1)] %*% U[1:(i-1), j]) / L[i, i]
}
}
}
return(list(L = L, U = U))
}
應用于您的矩陣它回傳的示例
A = matrix(c(-10, 30, 50,
-6, 16, 22,
-2, 1, -5), 3, 3, byrow = TRUE)
> LUcrout(A)
$L
[,1] [,2] [,3]
[1,] -10 0 0
[2,] -6 -2 0
[3,] -2 -5 5
$U
[,1] [,2] [,3]
[1,] 1 -3 -5
[2,] 0 1 4
[3,] 0 0 1
這與您的建議不同,但與 MATLAB 回傳的相同(請參閱 Wikipedia 上的“Crout-matrix-decomposition”頁面)。
LU 分解不是唯一的。在您看來,Crout 演算法有哪些優勢?
uj5u.com熱心網友回復:
取 A 轉置的 Doolittle 分解,交換 L 和 U 并取它們的轉置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/411536.html
標籤:
下一篇:如何計算矩形第四個角的位置?
