如何将非常大的MATLAB稀疏矩阵保存到文本文件中?

时间:2008-10-20 09:17:04

标签: matlab interop

我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写为ASCII(不支持)。在此怪物上调用full()会导致Out of Memory错误 我该如何导出它?

8 个答案:

答案 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也可能有用。