17

MATLAB (バージョン 7) に 30000x14000 の疎行列があり、これを別のプログラムで使用する必要があります。save を呼び出しても、これは ASCII として書き込まれません (サポートされていません)。full()このモンスターを 呼び出すとOut of Memoryエラーになる。
どうすればエクスポートできますか?

4

8 に答える 8

29

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

しかし、これはインデックスをdoubleとしてダンプします。これは、fopen / fprintf/fcloseを使用してより適切に書き出すことができます。

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

お役に立てれば。

于 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...

ind2sub必要に応じて、線形インデックスを行、列の添え字に変換するために 使用できます。

下付き文字 + 値から matlab でスパース行列を再作成する必要がある場合は、 を使用しますspconvert

于 2008-10-27T14:17:40.657 に答える
1

dlmwrite - マトリックスを ASCII 区切りファイルに書き込む

dlmwrite(ファイル名, M)

dlmwrite(ファイル名, M, 'D')

dlmwrite(ファイル名, M, 'D', R, C)

dlmwrite(ファイル名, M, 'attrib1', 値1, 'attrib2', 値2, ...)

dlmwrite(ファイル名, M, '-append')

dlmwrite(ファイル名, M, '-append', 属性値リスト)

于 2010-09-12T06:49:01.043 に答える
0

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

これが定期的に行う必要がある場合は、@ Vebjornのアドバイスに従い、ライブラリを使用して .mat ファイルを読み取ります。

于 2008-10-20T11:41:45.910 に答える