2014-02-23 7 views
0

텍스트 파일에 희소 행렬을 쓰고 싶습니다. 내 희소 행렬이 A이라고 가정 해 봅시다. A의 첫 번째 행은 10,11 번째 색인에서 0이 아닌 값을가집니다. 두 번째 행은 1,2 번째 인덱스에서 0이 아닌 값을가집니다. 그런 다음 텍스트 파일에 데이터를 쓸 때이 형식은 다음과 같아야합니다.텍스트 파일에 희소 행렬을 쓰는 방법

10 11 
1 2 
...... 
.... 

어떻게 이것을 MATLAB에서 수행 할 수 있습니까?

+1

행당 항상 동일한 수의 요소가 있습니까? 그렇지 않은 경우 빈 행이 있습니까? – Notlikethat

+0

해당 항목의 실제 값을 신경 쓰지 않습니까? –

+0

@ LuisMendo. 아니, 나는 실제 가치에 관심이 없다. – user34790

답변

0

게시 코드가 허용되는지 확실하지 않은 첫 번째 게시물이지만, 아마도 이것이 당신이 찾고있는 것일까요? 제약 조건을 감안할 때

[rows, cols] = size(A); 
outFile = fopen('sparse.txt', 'a'); 
for m = 1:rows 
    n = 1; 
    while n <= cols 
     if A(m, n) ~= 0 
      fprintf(outFile, '%d ', A(m, n)); 
     end 
     n = n+1; 
    end 
    fprintf(outFile, '\r\n'); 
end 
+0

이것은 실제로 비효율적입니다. 내 데이터 크기는 2 백만에서 10 만입니다. 각 행을 반복 할 수 없습니다. – user34790

+0

@ user34790 그러면 어떻게됩니까? http://stackoverflow.com/questions/217852/how-can-i-save-a-very-large-matlab-sparse-matrix-to-a-text-file –

0

, 난 단지 정말 주어진 형식에 대해 하나의 현명한 선택을 참조하십시오

:

f = fopen('out.txt', 'w'); 
for ii=1:size(mat, 1) 
    fprintf(f, '%u ', find(mat(ii, :)); 
    fprintf(f, '\n'); 
end 
fclose(f); 

행 당 요소의 수는 일정하지 않기 때문에,이 두 가지를 의미합니다

  • 벡터화 된 함수에 전달할 단일 행렬을 구성 할 수 없으므로 행 단위 작업의 일부 형식이 필요합니다.
  • fprintf도 하나의 전체 행을 하나의 호출로 작성하는 고정 형식 문자열을 제공 할 수 없으므로 복수 fprintf 호출이 필요합니다.

따라서 이러한 제약 조건을 최적화하십시오. 직접 행을 통해

  • 으로 반복 - 예, 우리는 find로 한 번에 행과 열 인덱스를 꺼내 수 있지만, 우리는 낭비했습니다 메모리가 효과적으로 전체 데이터 세트를 복사, 우리는가이 여전히 을 거라고 어떻게 든 반복 할 수 있습니다.
  • 낮은 수준의 내부 작업을 최소화하십시오. find 및 벡터화 된 fprintf의 로우 레벨 내부는 최소한 가능한 한 빨리 단일 행을 처리하도록하십시오. 이 I/어쨌든 O가 결합 된 것으로 책임을지지, 그래서 정말 루프 자체의 오버 헤드는 fprintf 통화의 경우에도 최소한의 수에 비해 무시할 수 있어야 -

때때로 간단한 루프는 정말 최선의 방법입니다.

관련 문제