2011-10-22 17 views
3

私はデータをシリアライズするための標準関数を見つけることができないようです。私は単一のデータベースフィールドに格納する必要がある大きな128x51配列を持っています。何らかの種類のシリアライズがなければ、問題が発生します。データベース挿入用の多次元配列をMATLABでシリアル化する最も簡単な方法は?

これを解決するにはどうすればよいですか?私はかなり多くの標準的な手順に精通していないので、私はかなり多くのMATLABを使用していません...

+1

同様の質問:[それは)(保存MathWorks社のMATLABを傍受することは可能ですバイトストリーム](http://stackoverflow.com/questions/4807035/is-it-possible-to-intercept-a -matlab-save-bytestream)(有用な答えの多く) – Amro

答えて

4

一つの可能​​性(のみフル、非複合数値のために働く)UINT8バイトに数値を変換するTYPECAST関数を使用することです。マトリックス前シリアライゼーションにベクターに再形成する必要があり、したがってそのサイズも(同じプロセスを使用して、あるいはシリアライズ)別々に保存されなければならないこと

%# sample matrix 
M = rand(3,4); 

%# convert 
b_sz = typecast(size(M),'uint8'); %# serialized matrix size 
b = typecast(M(:),'uint8');   %# serialized vector 

今度は格納することができますバイトのシーケンスとしてbとデータベースにb_sz(範囲[0,255]の整数)

>> whos b b_sz 
    Name  Size   Bytes Class Attributes 

    b   96x1    96 uint8    
    b_sz  16x1    16 uint8   

次に、あなたがDBからこれらの値を取得するとき、あなたが戻って使用してdouble型の値に変換することができます逆の手順、および元のサイズに行列を再構築:

MM = reshape(typecast(b,'double'), typecast(b_sz,'double')); 

%# compare against original matrix 
isequal(M,MM) 

必要に応じて、データベースが配列型をサポートしていない場合、あなただけの文字列としてバイト列に変換し、VARCHARに格納することができますフィールドの種類:

%# as string 
str = sprintf('%d ',b); 

%# recover bytes from string 
b = uint8(str2num(str)); 
+2

実際、FEXの[Serialize/Deserialize](http://www.mathworks.com/matlabcentral/fileexchange/29457)の提出が行われているようで、より多くのケースのみを処理します(構造体とセルを含むすべてのMATLABデータ型) – Amro

-2

私はあなたの質問を正しく把握しているかどうかは分かりませんが、もし1にMを設定した場合

B = reshape(A,m,n); 

、及びN(* 51 128)には、データを '直列化' されている:それは、m行n列のマトリックスに入力行列Aを整形します。

MATLAB Documentation

+0

-1それはあなた自身の助けにはならない、あなたがpについて気にしないなら浮動小数点数を正確に予約する – Amro

関連する問題