Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将非常大的MATLAB稀疏矩阵保存到文本文件中?_Matlab_Interop - Fatal编程技术网

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

如何将非常大的MATLAB稀疏矩阵保存到文本文件中?,matlab,interop,Matlab,Interop,我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写入ASCII(不支持)。对此怪物调用full()会导致内存不足错误。 如何导出它?您尝试过分区吗 我的意思是,尝试对前1000行(或5000行)调用full(),然后重复该过程(如果可行)。将稀疏矩阵保存为.mat文件。然后,在另一个程序中,使用合适的库读取.mat文件 例如,如果另一个程序是用Python编写的,您可以使用scipy.io.mio.loadmat函数,它支持稀疏数

我在MATLAB(版本7)中有一个30000x14000稀疏矩阵,我需要在另一个程序中使用它。调用save不会将其写入ASCII(不支持)。对此怪物调用
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)