MATLAB (バージョン 7) に 30000x14000 の疎行列があり、これを別のプログラムで使用する必要があります。save を呼び出しても、これは ASCII として書き込まれません (サポートされていません)。full()
このモンスターを 呼び出すとOut of Memory
エラーになる。
どうすればエクスポートできますか?
8 に答える
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)
お役に立てれば。
スパース行列を.mat
ファイルとして保存します。次に、他のプログラムで、適切なライブラリを使用して.mat
ファイルを読み取ります。
たとえば、他のプログラムがPythonで記述されている場合は、scipy.io.mio.loadmat
スパース配列をサポートし、スパースnumpy行列を提供する関数を使用できます。
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
行列です。
パーティション化してみましたか?
つまり、最初の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(ファイル名, M)
dlmwrite(ファイル名, M, 'D')
dlmwrite(ファイル名, M, 'D', R, C)
dlmwrite(ファイル名, M, 'attrib1', 値1, 'attrib2', 値2, ...)
dlmwrite(ファイル名, M, '-append')
dlmwrite(ファイル名, M, '-append', 属性値リスト)