2014-10-14 3 views
-1

거대한 희소 행렬 a이 있는데 .csv에 저장하고 싶습니다. 충분한 램 메모리가 없기 때문에 full(a)으로 전화를 걸 수 없습니다. 따라서 dlmwritefull(a) 인수로 호출 할 수 없습니다. dlmwrite은 스파 스 형식의 행렬에서 작동하지 않습니다.CSV에 희소 배열 저장

.csv 형식은 다음과 같습니다. 문자가있는 첫 번째 행과 열은 .csv 파일에 포함되어야합니다. .csv 파일의 (0,0) 위치에있는 세미콜론도 필요합니다.

;A;B;C;D;E 
A;0;1.5;0;1;0 
B;2;0;0;0;0 
C;0;0;1;0;0 
D;0;2.1;0;1;0 
E;0;0;0;0;0 

이 문제를 해결하고 마지막으로 스파 스 매트릭스를 원하는 형식으로 저장하도록 도와주십시오. 다음과 같이

csvwrite('matrix.csv',a) 
+0

내 게시물에 일부 변경 사항이 있습니다. 나는 이것이 아래 표를 제거하고 관심을 끌기를 바랍니다 : – StackQuery

+0

당신은 반복을 사용할 수 있습니다. 그러나 행렬이 매우 크고 매우 드문 경우 0이 아닌 값과 해당 인덱스 만 저장하는 것도 고려할 수 있습니다. 그게 선택의 여지가 있니? – MeMyselfAndI

+0

질문 : 원본 매트릭스의 크기는 얼마나됩니까? 26 x 26보다 큰가요? 그렇다면 Z를 어디로 이동합니까? (AA?) – nkjt

답변

0

당신은 반복적으로이 작업을 수행 할 수 있습니다 :

A = sprand(20,30000,.1); 

delimiter = ';'; 
filename = 'filecontaininghugematrix.csv'; 

dims = size(A); 
N = max(dims); 

% create names first 
idx = 1:26; 
alphabet = dec2base(9+idx,36); 
n = ceil(log(N)/log(26)); 
q = 26.^(1:n); 
names = cell(sum(q),1); 
p = 0; 
for ii = 1:n 
    temp = repmat({idx},ii,1); 
    names(p+(1:q(ii))) = num2cell(alphabet(fliplr(combvec(temp{:})')),2); 
    p = p + q(ii); 
end 
names(N+1:end) = []; 

% formats for writing 
headStr = repmat(['%s' delimiter],1,dims(2)); 
headStr = [delimiter headStr(1:end-1) '\n']; 
lineStr = repmat(['%f' delimiter],1,dims(2)); 
lineStr = ['%s' delimiter lineStr(1:end-1) '\n']; 

fid = fopen(filename,'w'); 

% write header 
header = names(1:dims(2)); 
fprintf(fid,headStr,header{:}); 
% write matrix rows 
for ii = 1:dims(1) 
    row = full(A(ii,:)); 
    fprintf(fid, lineStr, names{ii}, row); 
end 

fclose(fid); 

names 셀 어레이는 매우 기억이 예를 들어 요구하고있다

1

당신은 csvwrite 기능을 사용할 수 있습니다. 나는 지금 그것을 고칠 시간이 없으므로, 정말로이 부분에 대해서 생각해 보라.) 힌트 : 헤더 요소를 현명하게 쓰면, 먼저 A;, 그 다음에 B; 등등이 쓰인다. 행의 경우 인덱스 ii을 원하는 문자로 매핑하는 함수를 만들 수 있습니다.이 경우 첫 번째 부분은 필요하지 않습니다.

+0

A, B, C 기호도 저장하고 싶습니다. 또한 csvwrite는 스파 스 행렬에 대해 정의되지 않습니다. 'dlmwrite ('my_data.csv', full (a), ';')'를 시도했지만 행렬 a가 매우 크기 때문에 메모리 문제가 있습니다. 나는 해결책이 이것을 반복적으로하는 것이라고 생각한다. – StackQuery