2010-05-27 6 views
4

A가 큰 행렬 인 경우 exp (b * A)를 사용하는 확산 커널을 계산하고 싶습니다. b의 값을 가지고 놀기 위해서 A를 대각선으로 나타내기를 원한다. (그래서 exp (A)가 빨리 돌아 간다).큰 행렬을 대각선 화하는 도구

내 매트릭스는 약 25k x 25k이지만 매우 희박합니다. 약 60k 값은 0이 아닙니다. Matlab의 "eigs"기능은 옥타브의 "eig"와 R의 "eigen"처럼 메모리가 부족합니다. 거대하고 희소 한 행렬의 분해를 찾는 도구가 있습니까?

Dunno는 관련성이 있지만 인접성 매트릭스이므로 대칭이므로 전체 등급입니다.

답변

0

옥타브는 스파 스 매트릭스에 대해 분해를 수행하는 splu를가집니다. 25k x 25k를 처리 할 수 ​​있는지 여부는 확실하지 않지만 한 번만해볼 가치가 있습니다.

또는 행렬이 다음과 같이 구성되어있는 경우 : A = [B 제로; C] 다음 B와 C를 따로 따로 대각선 화하여 하나의 행렬에 넣을 수 있습니다. 나는 당신이 eig를 위해 비슷한 것을 할 수 있다고 생각하고있다.

+0

어리석은 질문이지만, 일단 내가 루가 있으면 어떻게 사용합니까? det (A) = det (L) * det (U)라는 것을 알기 때문에 대각선 사이에 어떤 관계가 있어야합니다. 그러나 나는 그것을보기에 충분히 똑똑하지 않습니다. – Xodarap

2

matlab에서 스파 스 매트릭스에 대해 svds을 시도해 보셨습니까?

편집 : 한 가지 더, 전체 등급 SVD를하지 마십시오. 크기가 커서 코드가 작아서 솔루션이 메모리에 적합하도록 작은 순위를 사용하십시오. 이것은 작은 고유치와 그 벡터를 제거합니다. 따라서 귀하의 정확성을 크게 손상시키지 않습니다. (- 1) {(SI-A)^(- 1)} L은^(- 1) 라플라스 역 변환 EXP (A *의 t) = L^

+0

@ A = USV '. S는 대각선에 고유 벡터가있는 정사각 행렬입니다. –

+1

+1 @duffymo : svd와 고유 값 분해 간의 관계에 대한 위키피디아를 참조하십시오. 어쨌든 OP는 svd가하는 A의 대각선 화를 요구하고있었습니다. – vad

+0

나는이 작업을 광산에서 시도하고 "최대 가변 크기를 초과했습니다."라고 말했습니다. 내 컴퓨터가 정확히 최고급 라인이 아니기 때문에 문제가 될 수도 있습니다. 대신 MATLAB을 사용하십시오. – Xodarap

1

당신은 following property 간주 했는가? - 반전 할 수 있다고 가정하면

+0

나는 역 라플라스가 O (n^4)에서 실행된다고 생각하는데, 이것은 매우 느립니다. 또한 오류가 발생하기 쉽습니다. http://www.cs.cornell.edu/cv/ResearchPDF/19ways+.pdf를 참조하십시오. – Xodarap

1

64 비트 시스템에 액세스 할 수 있고 64 비트 지원으로 컴파일 된 옥타브를 사용하면이 문제를 해결할 수 있습니다.

또한이 플랫폼을 실행하는 플랫폼을 모르지만 UNIX 기반 시스템에서는 ulimit을 사용하여 사용자 프로세스에 허용되는 최대 스택 크기를 늘릴 수 있습니다.

예를 들어,

ulimit -u unlimited 

를 실행할 수 있으며이 당신의 프로세스에는 메모리 제한 등이 없는지 확인합니다. 이것은 일반적으로 좋은 생각이 아닙니다. 시스템을 완전히 망칠 수있는 과도한 프로세스가 있기 때문입니다. 대신 스택 크기 제한을 늘리려면

ulimit -s [stacksize] 

을 증가 시키십시오.