2016-10-19 4 views
1

약 100k 노드를 가진 큰 간단한 그래프 G과 그것의 인접 행렬 A (스파 스, 대칭 및 바이너리)이 있습니다. (A*A).A을 계산해야하지만, 불행하게도 A*A은 MATLAB에서 메모리 오류를 발생시킵니다. 그렇게 할 수있는 효과적인 방법이 있습니까?큰 희소 행렬의 곱셈은 메모리 오류를 야기합니다.

참고 : 스파 스 매트릭스 형식으로 시도했습니다.

+0

'nnz (A)'란 무엇입니까? 그것은 유향 그래프입니까 (즉, 대칭입니까)? –

+0

귀하의 의견을 주셔서 감사합니다, 네, 내가 위에서 말한 스파 스와 대칭입니다. –

답변

2

우선 : 나는 nnz(A)이 상당히 낮다고 가정하고있다. 방금 nnz(A) = 9999963size(A) = 1000000x1000000으로 테스트했습니다. 직관적 인 접근 방식은 데이터를 "청크"로 작업하는 것입니다. 첫 번째 10000 열 (모든 행)과 첫 번째 10000 행 (모든 열), 다음 10000, 다음 등. 나는 이것이 메모리 문제를 피해야한다고 생각합니다.

방금 ​​A*A을 테스트했으며 이전과 동일한 메모리 문제가 발생했습니다. 내가 한 일은 A을 논리적으로 변환하는 것입니다 : A_logical = logical(A). 이렇게하면 행렬의 크기가 상당히 줄어 듭니다. sparse이 지원하는 유일한 데이터 유형은 logicaldouble이므로 uint8 또는 이와 유사한 것을 사용할 수 없습니다. 미세 논리적 매트릭스를 제곱, 그러나

Error using * 
Both logical inputs must be scalar. 

작품 :

이제 A_logical*A_logical는 오류 메시지와 함께 실패

A_square = A_logical^2; 

참고 A_logical^2의 결과는 아니다 논리 행렬이지만 두 배이므로 올바른 값을 얻을 수 있습니다. 10뿐 아니라

메모리 문제가없는 나를 잘 처리했습니다. 컴퓨터는 약 20 초 동안 정지되었으므로 "힘든"계산이지만 작동했습니다.

+0

'A_logical * A_logical'과'A_logical^2'는 다른 행동을 보여줍니다 ... 그렇지 않습니까? – erfan

+0

네, 저도 그렇게 생각합니다. 아마 그것은 A_logical * B_logical이 MATLAB에서 구현되지 않은 계산 인 것과 같을 것입니다. 왜냐하면 그것은 단지 제곱 (두 개의 행렬은 다른 크기를 가질 수 있습니다)보다 복잡하기 때문입니다. 'A_logical^2'는 같은 차원을 가진 두 개의 정사각형 행렬이 될 것이므로 구현하기가 더 쉽습니다. –

+0

나는 이것을 시도했지만, 불행히도 기억 문제는 여전히 존재한다. 곱셈으로 곱셈을하는 법을 설명 할 수 있습니까? –

관련 문제