在csv中保存稀疏数组

时间:2014-10-14 13:59:17

标签: matlab

我有一个巨大的稀疏矩阵a,我想将其保存在.csv中。我无法拨打full(a),因为我没有足够的内存。因此,使用dlmwrite参数调用full(a)是不可能的。我们必须注意dlmwrite不适用于稀疏格式的矩阵。

.csv格式如下所示。请注意,带有字符的第一行和第一列应包含在.csv文件中。 <{1}}文件的(0,0)位置中的分号也是必需的。

.csv

请你帮我解决这个问题,最后以所需的形式保存稀疏矩阵?

2 个答案:

答案 0 :(得分:1)

您可以使用csvwrite功能:

csvwrite('matrix.csv',a)

答案 1 :(得分: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单元阵列对内存要求很高。我现在没有时间解决这个问题,所以如果它确实是一个问题,请自己考虑这个部分;)提示:只需明智地编写标题元素,首先是A;,然后是B;,依此类推。对于行,您可以创建一个将索引ii映射到所需字符的函数,在这种情况下,不需要完整的第一部分。