2008-10-20 55 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」,屬性值列表)