2012-04-06 7 views
3

B<-as(A, "sparseMatrix")으로 만든 매트릭스에서 Matrix:::qr() 함수로 QR 분해를 수행하려고합니다. Matrix:::qr.R()으로 R 매트릭스를 얻을 수 있다는 것을 알고 있습니다. 그러나 Q 매트릭스도 필요합니다. Matrix 패키지에는 qr.Q() 함수가없는 것 같습니다. 어떻게하면 Q 매트릭스를 얻을 수 있습니까?매트릭스 패키지에서 "sparseMatrix"클래스의 객체에 대해 QR 분해를 수행하려면 어떻게해야합니까?

답변

1

Q 매트릭스는 실제로 V 슬롯에 저장됩니다. 현재 R Matrix 버전에는 버그가있는 것으로 보입니다. qr 분해를하기 전에 신비하게 행 037을 매트릭스 a에 추가합니다. 개발자들이 와서 설명해주기를 바랍니다. 따라서 다음과 같은 코드는 R 모두 Q를 복구하는 데 도움이 :

gx.qr.Q <- function(a){ 
    if(is(a, "qr")){ 
    return(qr.Q(a, complete = T)) 
    }else if(is(a, "sparseQR")){ 
    Q <- diag(nrow = [email protected]@Dim[1], ncol = [email protected]@Dim[1]) 
    for(i in rev(1:[email protected]@Dim[2])){ 
     Q <- Q - ([email protected][ ,i] * [email protected][i]) %*% ([email protected][ ,i] %*% Q) 
    } 
    return(Q[order([email protected]), ][1:[email protected][1], 1:[email protected][1]]) 
    }else{ 
    stop(gettextf("gx.qr.Q() fails on class '%s'", class(a)[1])) 
    } 
} 

gx.qr.R <- function(a){ 
    if(is(a, "qr")){ 
    return(qr.R(a, complete = T)[ ,order(a$pivot)]) 
    }else if(is(a, "sparseQR")){ 
    if(length([email protected]) == 0){ 
     return([email protected][1:[email protected][1], ]) 
    }else{ 
     return([email protected][1:[email protected][1] ,order([email protected])]) 
    } 
    }else{ 
    stop(gettextf("gx.qr.R() fails on class '%s'", class(a)[1])) 
    } 
} 

나는 무작위로 설정 매트릭스 크기와 희소성에 의해 테스트 한 그들은 원활하게 작동합니다. 그러나 이것은 "왜 그런지 모른 채 작동하게"하는 스타일이며 토론을 위해 여기에 게시됩니다. 왜냐하면 나는 패키지 "매트릭스"의 구현 세부 사항을 해킹하지 않았기 때문이다.

+0

누군가가 함수가 "complete = F"를 처리하지 못한다는 것을 상기시켜줍니다. 하나는 신중하게 일부 행이나 열을 삭제하여 문제를 해결합니다. 그러나 여전히 qr 분해가 수학 정의와 비교하여 매우 정교하게 설계된 이유에 대해 혼란 스럽습니다. –

관련 문제