COM インターフェイスは、構造体またはスパース配列をサポートしていません。つまり、MATLAB と .NET の間でこれらを直接渡すことはできません。MATLAB コマンド ウィンドウに次のエラーが表示されます。
警告: ActiveX - 引数の型または値が無効です
回避策は、MATLAB 側で構造体のフィールドにアクセスし、サポートされている変換規則のいずれかを使用して C# にマーシャリングできる変数にそれぞれを格納することです。
以下に例を示します。
static void Main(string[] args)
{
// load MAT-file contents into a structure variable
matlab.Execute("S = load('wind.mat')");
// get field and store in separate variable
matlab.Execute("x = S.x;");
// obtain variable "x" from MATLAB into C#
var x = (double[,,]) matlab.GetVariable("x", "base");
// print array in C#
Console.WriteLine("ndims(x) = {0}, numel(x) = {1}", x.Rank, x.Length);
for (int i = 0; i < x.GetLength(0); i++)
{
for (int j = 0; j < x.GetLength(1); j++)
{
for (int k = 0; k < x.GetLength(2); k++)
{
Console.WriteLine("x[{0},{1},{2}] = {3}", i, j, k, x[i,j,k]);
}
}
}
}
double
上記の例では、使用される MAT ファイルには次のタイプの多次元行列が含まれています。
>> whos -file wind.mat
Name Size Bytes Class Attributes
u 35x41x15 172200 double
v 35x41x15 172200 double
w 35x41x15 172200 double
x 35x41x15 172200 double
y 35x41x15 172200 double
z 35x41x15 172200 double
load
もちろん、出力引数を使用して MAT ファイルを作成すると、そのファイルに格納されている変数をフィールドとする構造体が返されることに注意してください。
>> S = load('wind.mat')
S =
u: [35x41x15 double]
v: [35x41x15 double]
w: [35x41x15 double]
x: [35x41x15 double]
y: [35x41x15 double]
z: [35x41x15 double]
したがって、出力を指定せずにファイルをロードすることもできます。その場合、変数は個別の変数として直接ロードされます。