我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写为ASCII(不支持)。在此怪物上调用full()
会导致Out of Memory
错误
我该如何导出它?
答案 0 :(得分:28)
您可以使用find来获取索引&值向量:
[i,j,val] = find(data)
data_dump = [i,j,val]
您可以使用spconvert从data_dump重新创建数据,这意味着“从稀疏矩阵外部格式导入”(所以我猜这是一个很好的导出格式):
data = spconvert( data_dump )
您可以使用以下命令保存到ascii:
save -ascii data.txt data_dump
但是这会将索引转储为double,你可以用fopen / fprintf / fclose更好地写出来:
fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)
希望这有帮助。
答案 1 :(得分:7)
将稀疏矩阵保存为.mat
文件。然后,在另一个程序中,使用合适的库来读取.mat
文件。
例如,如果其他程序是用Python编写的,则可以使用scipy.io.mio.loadmat
函数,该函数支持稀疏数组并为您提供稀疏的numpy矩阵。
答案 2 :(得分:3)
我在MATLAB中使用Java将其保存为文本。 MATLAB代码:
pw=java.io.PrintWriter(java.io.FileWriter('c:\\retail.txt'));
line=num2str(0:size(data,2)-1);
pw.println(line);
for index=1:length(data)
disp(index);
line=num2str(full(data(index,:)));
pw.println(line);
end
pw.flush();
pw.close();
这里data
是一个非常大的稀疏矩阵。
答案 3 :(得分:2)
您尝试过分区吗?
我的意思是尝试在1000行(或5000)上调用full(),然后重复该过程(如果有效)。
答案 4 :(得分:1)
使用find
函数获取非零元素的索引......
idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...
如果需要,可以使用ind2sub
将线性索引转换为行,列下标。
如果您需要在下标+值中重新创建matlab中的稀疏矩阵,请使用spconvert
。
答案 5 :(得分:1)
dlmwrite - 将矩阵写入ASCII分隔文件 语法
dlmwrite(filename,M)
dlmwrite(filename,M,'D')
dlmwrite(filename,M,'D',R,C)
dlmwrite(filename,M,'attrib1',value1,'attrib2',value2,...)
dlmwrite(filename,M,' - append')
dlmwrite(filename,M,' - append',属性值列表)
答案 6 :(得分:0)
如果这只是一次性交易,那么我只是迭代矩阵并通过暴力将矩阵写入ASCII文件,或者使用@ Veynom's建议并调用full()行的子集。这可能需要一段时间,但它可能比学习如何读取MATLAB环境之外的.mat文件所需的速度更快。
如果这是您需要定期进行的事情,那么我会采用@ Vebjorn的建议并使用库来读取.mat文件。
答案 7 :(得分:0)
使用此脚本: msm_to_mm.m,将MATLAB稀疏矩阵写入MatrixMarket文件。
这个thread也可能有用。