非常に大きなMATLABスパース行列をテキストファイルに保存するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/217852

  •  03-07-2019
  •  | 
  •  

質問

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)

これが1回限りの場合は、マトリックスを反復処理して、ブルートフォースでASCIIファイルにマトリックスを書き込むか、@ Veynomの提案で、行のサブセットでfull()を呼び出します。しばらく時間がかかる場合がありますが、MATLAB環境の外で.matファイルを読み込む方法を学習するよりも速くなる可能性があります。

これを繰り返し行う必要がある場合は、@ Vebjorn のアドバイスとライブラリを使用して.matファイルを読み取る。

次のスクリプトを使用します。 msm_to_mm.m MATLABスパース行列をMatrixMarketファイルに書き込みます。

そして、このスレッドも役に立つかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top