我有这个稀疏的大小矩阵,可以说N x M
。
我想将数据写入文件,每行代表每一行。从该行中非零条目的数量开始。其次是指数,其值为非零空间,如下:
186 0:1 1:34 2:234 ...
123 0:23 2:23 6:303
其中186
表示第一行中的非零数。 0
代表第一列及其对应的值1
。接下来是第一行的第一列值34
,依此类推。
类似地,对于第二行,123
是非零值的数量。 0
代表第一列及其对应的值23
,依此类推。
我怎样才能在matlab中有效地做到这一点?
答案 0 :(得分:0)
使用find
命令获取稀疏矩阵的索引和值。如果你在矩阵的转置上执行此操作,结果索引将按行号排序,您可以轻松地将它们写入文件:
%// get the nonzero indices and values of matrix A
[jj, ii, val]=find(A.');
%// find the number of nonzeros in each row:
n_nonzero=full(sum(A~=0,2));
%// write to output file
fid = fopen('filename.txt','w');
counter=1;
for rownum=1:size(A,1)
%// write number of nonzero elements
fprintf(fid,'%d',n_nonzero(rownum));
%// write array indices and values
%// assumes integer values for the array (as in your example)
I = counter:counter+n_nonzero(rownum)-1;
fprintf(fid,' %d:%d',[jj(I) val(I)]');
fprintf(fid,'\n'); %// new line
%// increment counter
counter = counter + n_nonzero(rownum);
end
fclose(fid);
如果矩阵具有非整数值,则应更改格式字符串以打印相应的格式。另外,你说你希望每一行都在一个单独的行上,所以我在打印每一行后添加了一行,即使你的例子没有显示这一行。