2008-10-20 51 views

回答

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是一个非常大的稀疏矩阵。

+1

我很困惑 - 为什么使用java.io而不是MATLAB的内置fopen和fprintf? – SCFrench 2009-12-11 23:56:30

+0

可能是因为我比matlab知道更好的java,并且它是一个丢弃代码,所以它不需要很漂亮。它只是需要正常工作:) – Midhat 2009-12-15 16:57:40

2

你试过分区吗?

我的意思是尝试在1000个第一行(或5000)上调用full(),然后重复该过程(如果它工作的话)。

+0

是总是那一个选项,它可能会花费很多时间来写作ascii块并将它们稍后合并 – Midhat 2008-10-20 09:35:56

6

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

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

+1

其他程序是rapidminer – Midhat 2008-10-20 09:35:14

0

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

如果这是您需要重复执行的操作,那么我会采取@Vebjorn的建议并使用库来读取.mat文件。

1

使用find功能得到非零元素的索引...

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

如果你愿意,你可以使用ind2sub转换的线性指标,以行,列标。

如果您需要在matlab中使用下标+值重新创建稀疏矩阵,请使用spconvert

26

您可以使用find获得指数&值向量:

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

您可以重新从data_dump与spconvert,其目的是要“导入从稀疏矩阵外部格式”数据(所以我想这是一个很好的导出格式):

data = spconvert(data_dump) 

您可以保存到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) 

希望这有助于。

1

dlmwrite - 写矩阵为ASCII分隔的文件 语法

dlmwrite(文件名,M)

dlmwrite(文件名,M 'd')

dlmwrite(文件名,女, 'd',R,C)

dlmwrite(文件名,M 'attrib1',值1, 'attrib2',值2,...)

dlmwrite(文件名,男,“-append”)

dlmwrite(文件名,男,“-append”,属性值列表)