2016-07-18 1 views
1

매우 큰 매트릭스 (5e6 x 5e6)의 로그 결정 요인을 계산하고 싶습니다. 그러나 매우 희박합니다. 각 행에는 6 개의 0이 아닌 항목 만 있습니다 (대각선을 7 개 계산). 그것은 또한 대칭적이고 긍정적 인 명확한 것입니다.고유 - 거대한 희소 매트릭스의 로그 결정 요인을 직접 계산합니다.

Eigen에서 나는 숄리스 분해를 사용하려고했습니다 : SimplicialLDLT<SparseMatrix<double>> 대각선의 로그 값 합계 (SimplicialLDLT::vectorD()에 의해 접근 가능) 그러나 분해는 매우 오랜 시간 동안 끝나지 않고 실행됩니다. 어떤 더 나은 접근법? 나는 실제로 어떤 종류의 분해, 즉 로그 결정자 그 자체 (또는 좋은 추정치)가 필요하지 않습니다.

+0

이러한 매트릭스의 경우, SimplicialLDLT는 1-2 초 정도의 속도로 빨라야합니다. 컴파일러 최적화를 ON으로 컴파일하고 매트릭스를 올바르게 채웠는지 확인하십시오. – ggael

+0

당신은 스왑을 치고 있지 않다는 것을 확인할 수 있습니까?나는 알고리즘을 조사하기 전에 어떤 점에서 Eigen이 거대한 행렬을 채우려 고 노력하고 있기 때문에 묻습니다. –

+0

또한 0이 아닌 항목의 크기는 어떤 순서로 지정됩니까? 테스트 할 비슷한 배열을 만들려고 노력하고 있지만 균일 한 임의의 데이터 또는 일반 임의의 데이터 또는 0 아닌 항목을 채워야하는지 잘 모르겠습니다. –

답변

0

은 나뿐만 아니라 답변으로 이것을 넣을 수 있습니다.

처음에 Eigen의 documentation on sparse solvers은 "매우 희소하고 너무 큰 문제는 아닙니다."라고 말합니다. 귀하의 문제는 매우 희박하지만 매우 큽니다.

둘째,SimplicialLDLT 필요 입력이 ​​아니라 대칭 ("selfadjoint")뿐만 아니라 당신이 거의 확실하지 않은, 긍정적 인 명확한 할 수 있습니다 (당신이 달리 생각하는 이유가 없다면?).

SimplicialLDLT은 Cholesky 분해를 계산하는 데 많은 시간을 소비 할 수 있습니다. 매트릭스가 양의 값이 아니므로 성공적으로 찾을 수 없습니다.

이렇게하면 세 번째 지점으로 안내합니다. 나는 in Matlab, 문제의 작은 버전을 생성했습니다 : 1e4에 의해 1e4 희소 행렬, 대칭, 1에서 5 사이의 대각선에 작은 정수가 있고, 각 행에는 -1의 여섯 가지 항목이 있습니다. Matlab에 해당하는 LDLT는 ldl이고 이상하게도 양의 한정 행렬이 필요하지 않으므로 1e4로 1e4 예제를 몇 초 만에 씹었습니다 (LDL로 분해하는 것보다는 희소 행렬을 생성하는 데 오래 걸립니다) .

여기 (매트랩 spy(L) 통해) 하위 삼각형 요소의 희소성 패턴이다 :

Lower-triangular factor’s sparsity pattern

이는 1E7 비제로 요소를 가지며, 162 메가 바이트 RAM을 차지한다. 이것은 1e4 by 1e4 문제에 해당합니다. 메모리 사용량이 행렬의 길이 (1e4 → 5e6)에 따라 선형 적으로 조정되면 거의 80GB RAM 사용량을 볼 수 있습니다. 대신에 요소의 수 (1e4^2 → 5e6^2)에 비례한다면 38 TB RAM이 필요합니다 ...이 분석 결과는 아무 것도 없습니다 - 5e6에 의한 5e6으로의 스케일링은 LDL의 ' 요인들, 그러나 이것은 에이 겐이 교수형에 처하는 이유를 설명 할 수 있습니다. 주석에서 언급했듯이 스왑 파일이 스 래싱하는지 확인하십시오.

네 번째 문제는 1E4에 의해 1E4의 내 테스트 예를 들어, 내가 하단 삼각 L 매트릭스의 대각선에 정확히 제로 항목을 많이 가지고, 그래서 전체 희소 행렬의 행렬식가 제로 점이다 배정도, 로그 또는 로그 없음.

관련 문제