非常に大きなMATLABスパース行列をテキストファイルに保存するにはどうすればよいですか?
質問
MATLAB(バージョン7)には30000x14000のスパース行列があり、別のプログラムで使用する必要があります。 saveを呼び出しても、これはASCIIとして書き込まれません(サポートされていません)。このモンスターで full()
を呼び出すと、 Out of Memory
エラーが発生します。
エクスポートするにはどうすればよいですか
解決 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
は非常に大きなスパース行列です。
他のヒント
findを使用して、インデックスとアンプを取得できます。値ベクトル:
[i,j,val] = find(data)
data_dump = [i,j,val]
spconvertを使用してdata_dumpからデータを再作成できます。これは、「スパースマトリックス外部形式からインポート」を意味します。 (だから私はそれが良いエクスポート形式だと思う):
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)
これがお役に立てば幸いです。
スパース行列を .mat
ファイルとして保存します。次に、他のプログラムで、適切なライブラリを使用して .mat
ファイルを読み取ります。
たとえば、他のプログラムがPythonで記述されている場合、 scipy.io.mio.loadmat
関数を使用できます。この関数は、スパース配列をサポートし、スパースnumpyマトリックスを提供します。
パーティションを分割しましたか?
最初の1000行(または5000行)でfull()を呼び出して、それが機能する場合はプロセスを繰り返します。
find
関数を使用して、非ゼロ要素のインデックスを取得します...
idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...
必要に応じて、 ind2sub
を使用して、線形インデックスを行、列の添え字に変換できます。
下付き文字+値からmatlabでスパース行列を再作成する必要がある場合は、 spconvert
を使用します。
dlmwrite -マトリックスをASCII区切りファイルに書き込む 構文
dlmwrite(filename、M)
dlmwrite(filename、M、 'D')
dlmwrite(ファイル名、M、 'D'、R、C)
dlmwrite(filename、M、 'attrib1'、value1、 'attrib2'、value2、...)
dlmwrite(filename、M、 '-append')
dlmwrite(filename、M、 '-append'、attribute-value list)
次のスクリプトを使用します。 msm_to_mm.m MATLABスパース行列をMatrixMarketファイルに書き込みます。
そして、このスレッドも役に立つかもしれません。