如何将非常大的MATLAB稀疏矩阵保存到文本文件中?
我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写入ASCII(不支持)。对此怪物调用如何将非常大的MATLAB稀疏矩阵保存到文本文件中?,matlab,interop,Matlab,Interop,我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写入ASCII(不支持)。对此怪物调用full()会导致内存不足错误。 如何导出它?您尝试过分区吗 我的意思是,尝试对前1000行(或5000行)调用full(),然后重复该过程(如果可行)。将稀疏矩阵保存为.mat文件。然后,在另一个程序中,使用合适的库读取.mat文件 例如,如果另一个程序是用Python编写的,您可以使用scipy.io.mio.loadmat函数,它支持稀疏数
full()
会导致内存不足
错误。如何导出它?您尝试过分区吗
我的意思是,尝试对前1000行(或5000行)调用full(),然后重复该过程(如果可行)。将稀疏矩阵保存为
.mat
文件。然后,在另一个程序中,使用合适的库读取.mat
文件
例如,如果另一个程序是用Python编写的,您可以使用
scipy.io.mio.loadmat
函数,它支持稀疏数组,并为您提供一个稀疏numpy矩阵。如果这几乎是一次性处理,那么我只需迭代该矩阵,然后通过蛮力将矩阵写入ASCII文件,或者对行的子集使用@suggestion并调用full()。这可能需要一段时间,但可能比在MATLAB环境之外学习如何读取.mat文件要快
如果这是你需要反复做的事情,那么我会接受@的建议,使用一个库来读取.mat文件。我使用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();
这里的
数据
是一个非常大的稀疏矩阵。使用查找
函数获取非零元素的索引
idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...
如果需要,可以使用ind2sub
将线性索引转换为行、列下标
如果需要在matlab中从下标+值重新创建稀疏矩阵,请使用
spconvert
您可以使用find获取索引和值向量:
[i,j,val] = find(data)
data_dump = [i,j,val]
您可以使用spconvert从数据转储重新创建数据,这意味着“从稀疏矩阵外部格式导入”(因此我想这是一种很好的导出格式):
您可以使用以下命令保存到ascii:
save -ascii data.txt data_dump
但这会将索引转储为双精度,您可以使用fopen/fprintf/fclose更精确地写出它:
fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)
希望这有帮助。dlmwrite-将矩阵写入ASCII分隔文件 语法 dlmwrite(文件名,M) dlmwrite(文件名,M,'D') dlmwrite(文件名,M,'D',R,C) dlmwrite(文件名,M,'attrib1',value1,'attrib2',value2,…) dlmwrite(文件名,M,'-append') dlmwrite(文件名,M,'-append',属性值列表)使用以下脚本: ,将MATLAB稀疏矩阵写入MatrixMarket文件
这可能也很有用。是的,这始终是一个选项,编写ascii块并在以后合并它们可能会花费很多时间。我很困惑-为什么要使用java.io而不是MATLAB的内置fopen和fprintf?可能是因为我比MATLAB更了解java,而且它是一个一次性代码,所以它不需要漂亮。它只需要正常工作:)fprintf命令期间的数据转储应该在使用之前根据文档进行转换()。这是因为数据是按顺序写入的。
fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)