Matlabに16x(2^20)マトリックスを保存する最良の方法は何ですか?
質問
データをファイルに書き込むことを考えています。ファイルに大量のデータを書き込む方法の例はありますか?
編集: マトリックスのほとんどの要素はゼロであり、他は uint32
. 。最も簡単だと思います save()
と load()
@Jonasが提案したように、機能します。
解決
ゼロの編集を見たことがないと思います:)
それらがほとんどゼロである場合は、マトリックスをそのまばらな表現に変換する必要があります。 それから それを保存。でそれを行うことができます スパース 働き。
コード
z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z
出力
Name Size Bytes Class Attributes
z 10000x10000 800000000 double
Name Size Bytes Class Attributes
z 10000x10000 40016 double sparse
まばらな実装が処理するように設計されているとは思わない uint32
.
他のヒント
データファイルのサイズを可能な限り小さく保つことに関心がある場合は、次の提案を次に示します。
- データをバイナリファイルに書き込む(つまり、使用する fwrite)テキストファイルの代わりに(つまり、使用する fprintf).
- データにすべての整数値が含まれている場合は、に変換するか、 署名または署名されていない整数型 デフォルトの代わりに 二重精度タイプ Matlabは使用します。
- データに浮動小数点値が含まれているが、デフォルトの範囲や解像度は必要ない場合 二重精度タイプ, 、それを変換するか、aとして保存します 単一の精度タイプ.
- データが十分にスパースである場合(つまり、マトリックスにはゼロ以外よりも多くのゼロがあります)、使用できます 探す ゼロ以外の値の行と列インデックスを取得する機能を機能させ、ファイルに保存するだけです。
説明する例をいくつか紹介します。
data = double(rand(16,2^20) <= 0.00001); %# A large but very sparse matrix
%# Writing the values as type double:
fid = fopen('data_double.dat','w'); %# Open the file
fwrite(fid,size(data),'uint32'); %# Write the matrix size (2 values)
fwrite(fid,data,'double'); %# Write the data as type double
fclose(fid); %# Close the file
%# Writing the values as type uint8:
fid = fopen('data_uint8.dat','w'); %# Open the file
fwrite(fid,size(data),'uint32'); %# Write the matrix size (2 values)
fwrite(fid,data,'uint8'); %# Write the data as type uint8
fclose(fid); %# Close the file
%# Writing out only the non-zero values:
[rowIndex,columnIndex,values] = find(data); %# Get the row and column indices
%# and the non-zero values
fid = fopen('data_sparse.dat','w'); %# Open the file
fwrite(fid,numel(values),'uint32'); %# Write the length of the vectors (1 value)
fwrite(fid,rowIndex,'uint32'); %# Write the row indices
fwrite(fid,columnIndex,'uint32'); %# Write the column indices
fwrite(fid,values,'uint8'); %# Write the non-zero values
fclose(fid); %# Close the file
上記で作成されたファイルのサイズは劇的に異なります。ファイル 'data_double.dat'
約131,073 kbになります。 'data_uint8.dat'
約16,385 kbになります 'data_sparse.dat'
2 kb未満になります。
データを読み戻すことができるように、ファイルにデータベクトルサイズを書きました。 フリード)そして適切に再形成されます。また、私が供給しなかった場合にも注意してください 'double'
また 'uint8'
への議論 fwrite, 、Matlabは、デフォルトの二重精度を使用する必要がなく、データ値を書き出すために8ビットしか使用しないことを理解するのに十分賢いでしょう(それらはすべて0と1であるため)。
データはどのように生成されますか?データにどのようにアクセスする必要がありますか?
正しく計算すると、すべてが2倍の場合、変数は200MB未満です。したがって、Matlabからのみアクセスする必要がある場合は、簡単に1つの.matファイルとして簡単に保存してロードできます。
%# create data
data = zeros(16,2^20);
%# save data
save('myFile.mat','data');
%# clear data to test everything works
clear data
%# load data
load('myFile.mat')