2014-04-04 5 views
0

큰 블록 대각선 스파 스 행렬의 역함수를 계산하고 싶습니다. 행과 열의 수가 50,000을 약간 넘습니다. 블록은 12 x 12이며 스파 스 (27 개의 0이 아닌 요소)입니다.큰 블록 대각선 희소 행렬의 역함수가

전체 행렬의 역함수를 계산하려고했습니다 (solve를 사용). 이것은 가능하지 않았고 전체 매트릭스가 너무 큽니다.

그 후, for-loop를 사용합니다. 각각의 반복 안에서, 나는 하나의 블록을 꺼내서 역산을 계산하고 그것을 다시 놓습니다.

그 방법은 효과가 있지만 약 5 분이 걸립니다. 더 빠른 방법이 있는지 궁금합니다.

미리 감사드립니다.

+2

[scicomp.SE] (http://scicomp.stackexchange.com/)에서 질문하는 것이 좋을지 모르지만 큰 매트릭스를 뒤집 지 말라고 말할 것입니다. 왜 반대가 필요합니까? 너무 느린 이유는 블록을 제거하고 다시 넣는 것이 느리다는 것입니다. 수학은 매우 빠르게 할 수 있습니다. – Emmet

+0

당신은 이미'Matrix' 패키지의 스파 스 매트릭스와 메소드를 사용하고 있습니까? 그것은 당신의 질문에서 분명하지 않다. –

+0

네, 맞습니다. dgCMatrix – user3499209

답변

0

어떻게 50k x 50k 매트릭스로 끝나나요?

12 x 12 반전은 간단하고 신속합니다. 행렬 객체의 속도가 느려지거나 액세스하는 것을 반전시키는 것입니까?

큰 반전으로 무엇을 할 예정입니까? 오히려 큰 매트릭스에 다시 배치 '보다 목록의 블록 대각 행렬의 역행렬을 저장)

1

+0

행렬 객체에 액세스하면 천천히 ... 그 행렬의 블록을 여러 번 선택합니다. – user3499209

+0

왜 이렇게하고 싶은지 이유는 설명하기 쉽지 않습니다 .... 저는 2 차 최적화를 사용하고 싶습니다. 나는 C++로 부분적으로 프로그램 된 형태의 문제 (min (x * -x) '(x * -x))에 대한 매우 빠른 모듈을 처리했다. 내 문제는 다소 어렵다. 보다 일반적인 형식 인 min x'A'x + cx입니다. 더 쉬운 문제 min (x * -x) '(x * -x)에서 문제를 변환하기 위해 역행렬을 사용합니다. 좀 더 일반적인 2 차 프로그램을 해결하기위한 몇 가지 R 모듈 Quadprog이 있다는 것을 알고 있습니다. 그러나 더 쉬운 문제에 대해서는 제 소프트웨어만큼 좋지 않습니다. – user3499209

0

는 I에 의해 훨씬 더 빨리 코드했다. 마지막에는 bdiag() 명령을 사용하여 목록에서 전체 행렬을 작성했습니다. 2) 블록 대각 행렬을 하나씩 고려하지 않고 약그룹을 고려하여, 따라서 10 블록 대각 행렬로 구성된 부분 행렬의 역수를 반복적으로 계산합니다.

원래 질문에서 나는 각 블록의 역함수를 취할뿐만 아니라 각 블록마다 약간의 변형을 적용했다고 말하지 않았다. 이제 블록 대각 행렬 전체에 대해 사전에 변환이 수행되므로 시간이 절약됩니다.