필자는 위 삼각 행렬을 가지고 있으며 그 역수를 빠르게 계산하려고합니다. 나는 qr.solve()
을 시도했지만 solve()
과 같으며 입력 행렬의 삼각형 특성을 이용하지 않는다고 생각합니다. 가장 좋은 방법은 무엇입니까?R에서 삼각 행렬을 반전시키는 방법은 무엇입니까?
답변
solve
은 qr.solve
보다 다소 빠른 성능을 나타내지 만 qr.solve
은 더욱 견고합니다. 매트릭스 세포를 편집 할 때 우리는 +3
를 제거하면, solve
거의 항상 실패하고 qr.solve
여전히 일반적으로 대답을 줄 것이다
n <- 50
mymatrix <- matrix(0, nrow=n, ncol=n)
fun1 <- function() {
for (i in 1:n) {
mymatrix[i, i:n] <- rnorm(n-i+1)+3
}
solve(mymatrix)
}
fun2 <- function() {
for (i in 1:n) {
mymatrix[i, i:n] <- rnorm(n-i+1)+3
}
qr.solve(mymatrix)
}
> system.time(for (i in 1:1000) fun1())
user system elapsed
1.92 0.03 1.95
> system.time(for (i in 1:1000) fun2())
user system elapsed
2.92 0.00 2.92
참고.
> set.seed(0)
> fun1()
Error in solve.default(mymatrix) :
system is computationally singular: reciprocal condition number = 3.3223e-22
> set.seed(0)
> fun2()
[returns the inverted matrix]
테스트 해 주셔서 감사합니다. 그러나 실제로
qrsolve이 입력 행렬의 삼각형 형태를 사용하는지 확신 할 수 없습니다. 그것을 QR 형식으로 분해하려고 시도해야합니다.하지만 이러한 행렬을 뒤집을 수있는 특정 (및 빠른) 알고리즘이 있습니다. –
backsolve()
을 시도하고 적절한 크기의 단위 행렬을 오른쪽 값으로 사용하십시오. 당신이 당신의 매트릭스 M
의 역을 얻고 싶다면
library(microbenchmark)
n <- 2000
n.cov <- 1000
X <- matrix(sample(c(0L, 1L), size = n * n.cov, replace = TRUE),
nrow = n, ncol = n.cov)
R <- chol(crossprod(X))
rm(X)
microbenchmark(
backsolve = backsolve(r = R, x = diag(ncol(R))),
solve = solve(R),
times = 10)
Unit: milliseconds
expr min lq mean median uq max neval
backsolve 467.2802 467.5142 469.4457 468.1578 468.6501 482.2431 10
solve 748.2351 748.8318 750.0764 750.3319 750.9583 751.5005 10
, 당신은 단순히 backsolve(M, diag(dim(M)[1]))
를 사용할 수 있습니다. 예를 들어 :
M <- matrix(rnorm(100), 10, 10) # random matrix
M[lower.tri(M)] <- 0 # make it triangular
Minv <- backsolve(M, diag(dim(M)[1]))
M%*%Minv
이 코드를 실행하면 인해 수치 근사 매우 낮은 계수 (~ 10^-15)으로 M%*%Minv
를 볼 수 있습니다.
R베이스 함수 chol2inv
은 삼각 행렬을 반전시키기위한 트릭을 수행 중일 수 있습니다. 대칭의 양의 정사각형 정사각형 행렬을 Choleski decomposition
에서 반전합니다. 동등하게, QR decomposition of X
의 (R 부분)에서 (X'X)^(-1)
을 계산하십시오. 더욱 일반적으로, 위 삼각 행렬 R이 주어진다면, (R'R)^(-1)
을 계산하십시오. 나는 마이크로 벤치의 방법으로 자사의 속도를 테스트 https://stat.ethz.ch/R-manual/R-devel/library/base/html/chol2inv.html
참조 : qr.solve가 느린이다, 속도, 등급 3를 해결 backsolve는 chol2inv가 가장 빠른 속도에서 2 위를 기록하고 있습니다.
CMA < - CHOL (MA < - cbind (1, 1 : 3, C (1,3,7)))
마이크로 벤치 (qr.solve (MA), 해결 (MA) 당신은 몇 가지 샘플 입력을 제공하는 경우 CMA < -chol (MA), chol2inv (CMA), invcma < -backsolve (CMA, DIAG (nrow (CMA))), backinvma < -tcrossprod (invcma는))
'chol2inv (M)'은 (M이 삼각형 인 경우에도)'M'의 역수를 반환하지 않습니다. –
- 1. 하위 삼각 행렬을 벡터 [JULIA]
- 2. R에서 벡터와 일치하는 행렬을 선택하십시오
- 3. R에서 제곱되지 않은 3D 플롯 행렬을 만드는 방법은 무엇입니까?
- 4. R에서 파일에 드문 드문 행렬을 작성하는 방법은 무엇입니까?
- 5. Matlab/R에서 3 개의 좌표 배열로 행렬을 만드는 방법은 무엇입니까?
- 6. Matlab의 이미지()에서 히트 맵의 색상을 반전시키는 방법은 무엇입니까?
- 7. R에서 NULL에서 행렬을 늘리는 중
- 8. R에서 행렬을 목록으로 변경하는 방법?
- 9. R에서 인접성 행렬을 계산하는 방법
- 10. 상단 삼각 행렬을 할당하는 함수 작성
- 11. 은 제가 삼각 행렬을 반전하는 알고리즘을 필요
- 12. 상 삼각 내가 상 삼각 행렬에서 <p>쿠다</p>과 상 삼각 행렬을 생성하는 행렬
- 13. R에서 희소 행렬을 읽을 때 오류가 발생했습니다
- 14. R에서 직교 행렬을 어떻게 찾을 수 있습니까?
- 15. 모션 경로에서 SVG (SMIL) 애니메이션을 효과적으로 반전시키는 방법은 무엇입니까?
- 16. 3x3 행렬을 만드는 방법은 무엇입니까?
- 17. 배열에서 행렬을 분리하는 방법은 무엇입니까?
- 18. 거대한 행렬을 처리하는 방법은 무엇입니까?
- 19. 행렬을 조 변경하는 방법은 무엇입니까?
- 20. 행렬을 90도까지 회전하는 방법은 무엇입니까?
- 21. MATLAB에서 행렬을 보간하는 방법은 무엇입니까?
- 22. 임의의 행렬을 만드는 방법은 무엇입니까?
- 23. matlab에서이 행렬을 반복하는 방법은 무엇입니까?
- 24. MATLAB에서 행렬을 샘플링하는 방법은 무엇입니까?
- 25. 행렬을 이미지로 변환하는 방법은 무엇입니까?
- 26. 행렬을 배열로 변환하는 방법은 무엇입니까?
- 27. DIA로 행렬을 그리는 방법은 무엇입니까?
- 28. 행렬을 0으로 설정하는 방법은 무엇입니까?
- 29. petsc 행렬을 만드는 방법은 무엇입니까?
- 30. R에서 MongoDB를 쿼리하는 방법은 무엇입니까?
이 최선의 방법 가능한 대답을 기꺼이 제공하는 사람들이 올바른 질문에 대답하고 있는지 확인하기 위해 예상되는 결과물을 제공해야합니다. – A5C1D2H2I1M1N2O1R2T1
나는 그 질문이 충분히 분명하다고 생각한다. 나는 함수 이름만을 찾고있을뿐, 또는 삼각형 행렬의 역함수를 효율적으로 계산하는 알고리즘을 찾지 못했다. –
'qr.solve'와'solve'는 당신이 암시하는듯한 의미에서 상응하지 않습니다. 첫 번째는 QR 분해를 사용하고 두 번째는 LU 분해를 사용합니다. 왜 당신은 반대를 원합니까? 삼각형 시스템을 풀고 싶다면'backsolve'와'forwardsolve'를보세요. – Bhas