1

Microsoft SQL Server のテーブルの 1 つのフィールドに 1 次元の Matlab 配列を格納する方法 (およびそれを取得する方法) を知っている人はいますか? 必ずしも固定サイズではない Matlab データの配列を格納できるようにしたいと考えており、コンマ区切りの文字列として格納することを検討しましたが、より洗練されたソリューションがあることを願っています。私の考えでは、byte[] を格納して読み取るのと同じはずです。しかし、私は何時間も試みてきましたが、インターネット上で本当に役立つものを見つけることができませんでした. 配列を格納するための私のMatlabコードは次のとおりです(ADOを使用):

buf = [1,2,3,4,5]; 
buf = int8(buf);
cmd = actxserver('ADODB.Command');
cmd.ActiveConnection = db.connection; % db.connection stores my connection
% Note that Matlab throws an error when setting the ActiveConnection. This
% command is still valid though and works, so the error should be ignored

cmd.CommandText = 'INSERT INTO dbo.TESTTABLE VALUES(?)'; % According to the MSDN
% website, this should be @val instead of ?, but for some reason that doesn't 
% work and the ? does.

param = cmd.CreateParameter(@val',205,1,8000,buf);
cmd.Parameters.Append(param);
cmd.Execute();

このコードは正しいのかもしれませんが、もう一度読み取る方法がわかりません。また、例としてサイズ 5 の配列を挙げましたが、もっと大きな配列を格納できるようにしたいと考えています。ご協力いただきありがとうございます、

マディ

4

3 に答える 3

1

TYPECASTを使用して、行列をバイト(uint8)のベクトルとしてシリアル化し、元の行列のサイズと型とともに結果をデータベースに格納できます。

次の例を考えてみましょう。データベースの代わりにファイルを使用していますが、その考え方は引き続き当てはまります。

%# some matrix, and record its size and type
x = rand(4,3);
sz = size(x);
cls = class(x);

%# serialize and write to file
b = typecast(x(:),'uint8');          %# byte array
fid = fopen('file.dat','wb');
fwrite(fid, b, 'uint8')
fclose(fid);

%# read file and deserialize
fid = fopen('file.dat','rb');
b = fread(fid, '*uint8');
fclose(fid);
xx = reshape(typecast(b,cls), sz);

%# compare against original matrix
isequal(x,xx)

上記では、シリアル化されたデータのみを保存しますが、サイズとタイプも一緒に保存する必要があります。この場合、テーブルに2つの追加フィールドを作成します。たとえば、1つはサイズ用、もう1つはタイプ用です。


ここで述べたように、行列とそのサイズ/タイプを手動でシリアル化したくない場合は、文書化されていない関数mxSerialize/mxDeserializeがありlibmxます。コメントには、単純なMEXラッパーへのリンクもあります。

これらには、MATLABデータ型(構造体、セル配列などを含む)で機能するという利点があります。

于 2012-06-13T18:47:39.833 に答える
1

SQL テーブルの列の型はバイナリである必要があります。次に、通常のマット ラボの 1 次元配列を使用して、それらをデータベースにエクスポートしてみます。

コンマや余分なものは必要ありません。これらは、Matlab ライブラリによってハンドヘルドされています。

たとえば、次のことができます。

colnames = {'ContentBinary' }; %this is the name of the column with the binary %content
data =   {[1:100000]}; % a one-d array in matlab
tablename = 'myData';
whereclause = 'where Id = 4028'; %this shows which row you are trying to write to
update(conn,tablename,colnames,data,whereclause)
close(conn); %conn is the connection to SQL DB
于 2016-07-15T19:22:16.260 に答える
0

同様の問題を試みている人のために、機能する方法を見つけました。質問に投稿したコードは、Matlab から MS SQL Server データベースにバイト配列を格納するのに適しています。ただし、ここでは VARBINARY(MAX) のフィールドに格納しており、自動的に署名なしで格納されることを知っておく必要があります。また、buf = [1,2,3,4,5] のような配列のみを格納し、buf = [1;2;3;4;5] のような配列の最初の値のみを格納します。

たとえば、ADOレコードセットでそれを取得するときは、Amroの回答のように実行できるint8に変換する必要があります。

シリアル化に関しては、Serializable を実装してオブジェクトをバイト配列に、またはその逆に変換する単純な Java クラスを作成しました。Java は Matlab から呼び出すことができるため、この方法は非常にうまく機能し、今では任意の Matlab ベクトル、配列、または文字列を varbinary 列に格納および取得できます。

于 2012-06-14T16:39:07.333 に答える