17

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

4

8 回答 8

29

You can use find to get index & value vectors:

[i,j,val] = find(data)
data_dump = [i,j,val]

You can recreate data from data_dump with spconvert, which is meant to "Import from sparse matrix external format" (so I guess it's a good export format):

data = spconvert( data_dump )

You can save to ascii with:

save -ascii data.txt data_dump

But this dumps indices as double, you can write it out more nicely with fopen/fprintf/fclose:

fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)

Hope this helps.

于 2008-12-18T16:08:57.483 回答
8

将稀疏矩阵保存为.mat文件。然后,在另一个程序中,使用合适的库来读取.mat文件。

例如,如果另一个程序是用 Python 编写的,您可以使用该scipy.io.mio.loadmat函数,该函数支持稀疏数组并为您提供稀疏的 numpy 矩阵。

于 2008-10-20T09:31:24.720 回答
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是一个非常大的稀疏矩阵。

于 2008-10-27T13:54:21.280 回答
2

你试过分区吗?

我的意思是尝试在前 1000 行(或 5000 行)上调用 full(),如果可行,则重复该过程。

于 2008-10-20T09:28:57.177 回答
2

使用该find函数获取非零元素的索引...

idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...

If you want, you can use ind2sub to convert the linear indices to row, column subscripts.

If you need to recreate a sparse matrix in matlab from subscripts + values, use spconvert.

于 2008-10-27T14:17:40.657 回答
1

dlmwrite - Write matrix to ASCII-delimited file Syntax

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', attribute-value list)

于 2010-09-12T06:49:01.043 回答
0

如果这几乎是一次性交易,那么我只需遍历矩阵并通过蛮力将矩阵写入 ASCII 文件,或者使用 @ Veynom 的建议并在行子集上调用 full()。这可能需要一段时间,但它可能会比学习如何在 MATLAB 环境之外读取 .mat 文件更快。

如果这是您需要经常做的事情,那么我会采纳@Vebjorn的建议并使用库来读取 .mat 文件。

于 2008-10-20T11:41:45.910 回答
0

Use this script: msm_to_mm.m, writes an MATLAB sparse matrix to an MatrixMarket file.

And This thread may also be useful.

于 2019-01-20T00:31:36.327 回答