私も構築している別の.NETアプリケーションによって維持されるデータを分析するために使用されるMatlabコンポーネントのインターフェイスレイヤーを構築しています。.NET データテーブルを数値配列としてシリアル化し、MATLAB コンポーネントに (より一般化されたシリアル化ルーチンの一部として) 渡そうとしています。
これまでのところ、数値データのテーブルを渡すことにはかなり成功していますが、 datatype の列を追加しようとすると問題が発生しましたDateTime
。これまで私が行ってきたことは、値をDataTable
double 配列に詰め込むことでした。これは、MATLAB が実際に double のみを気にするためです。次に、MWNumericArray
本質的に行列である a に直接キャストします。
これが現在のコードです。
else if (sourceType == typeof(DataTable))
{
DataTable dtSource = source as DataTable;
var rowIdentifiers = new string[dtSource.Rows.Count];
// I know this looks silly but we need the index of each item
// in the string array as the actual value in the array as well
for (int i = 0; i < dtSource.Rows.Count; i++)
{
rowIdentifiers[i] = i.ToString();
}
// convenience vars
int rowCount = dtSource.Rows.Count;
int colCount = dtSource.Columns.Count;
double[,] values = new double[rowCount, colCount];
// For each row
for (int rownum = 0; rownum < rowCount; rownum++)
{
// for each column
for (int colnum = 0; colnum < colCount; colnum++)
{
// ASSUMPTION. value is a double
values[rownum, colnum] = Conversion.ConvertToDouble(dtSource.Rows[rownum][colnum]);
}
}
return (MWNumericArray)values;
}
Conversion.ConvertToDouble
これも、Matlab がすべての NULLS を NaN として扱うため、NULL、DBNull に対応し、double.NaN を返す私自身のルーチンです。
これが問題です。複数のデータ型を持つ連続した配列を渡すことができる MATLAB データ型を知っている人はいますか? 私が考えることができる唯一の回避策は、 of を使用することMWStructArray
ですMWStructArrays
が、それはハッキーに思えますし、MATLAB コードでうまく機能するかどうかもわかりません。そのため、できればより洗練された解決策を見つけたいと思います。の使用を検討しましたが、MWCellArray
インスタンス化しようとするとコンパイル エラーが発生します。
次のようなことができるようになりたいです。
object[,] values = new object[rowCount, colCount];
// fill loosely-typed object array
return (MWCellArray)values;
しかし、私が言ったように、オブジェクト配列をコンストラクターに渡すことでもコンパイルエラーが発生します。
ばかげたことを見逃した場合はお詫び申し上げます。私はいくつかのグーグルを実行しましたが、Matlab から .NET インターフェイスへの情報は少し軽いように思われるため、ここに投稿しました。
前もって感謝します。
[編集]
提案してくれたみんなに感謝します。
私たちの特定の実装のための最も迅速で最も効率的な方法は、SQL コードで Datetime を int に変換することでした。
ただし、他のアプローチのうち、MWCharArray アプローチを使用することをお勧めします。それは大騒ぎを最小限に抑え、私が間違ったことをしただけであることが判明しました.MWNumericsまたはあなたが行くようにあなたの空想を取るものは何でも。注意すべきことの 1 つは、MWArray が 0 ベースではなく 1 ベースであることです。それは私を捕まえ続けます。
時間があれば、今日の後半でより詳細な議論に入る予定ですが、今はしていません。ご協力いただきありがとうございます。