.NET からの MATLAB 関数の実行
.NET から MATLAB® 関数を呼び出すときに、.NET 変数を関数に渡すことができます。MATLAB 関数が出力変数を返す場合、エンジンがその値を MATLAB から .NET に変換します。
.NET エンジン プログラムを設定およびビルドする方法の詳細については、.NET 開発環境のテストを参照してください。
.NET から MATLAB への変数の引き渡し
この例では、MATLAB 関数 linspace を使用して 1 次元 double 配列を作成し、reshape を使用して要素の形状を変更します。.NET から MATLAB へのデータの変換の詳細については、MATLAB 関数への .NET データ型の受け渡しを参照してください。
この例の MATLAB コードは、次のとおりです。
A = linspace(-5.0,5.0); sz = [25,4]; B = reshape(A,sz);
この例の C# コードは、次のとおりです。
using MathWorks.MATLAB.Engine;
using MathWorks.MATLAB.Exceptions;
using MathWorks.MATLAB.Types;
using System;
namespace MathWorks.MATLAB.Engine.ConsoleExamples {
public class Program {
public static void Main(string[] args) {
Console.Write("Starting MATLAB... ");
using (dynamic matlab = MATLABEngine.StartMATLAB()) {
Console.WriteLine("done.");
double[] A = matlab.linspace(-5.0,5.0);
int[] sz = new int[] {25,4};
double[,] B = matlab.reshape(A,sz);
}
// Call when you no longer need MATLAB Engine in your application.
MATLABEngine.TerminateEngineClient();
}
}
}
MATLAB から .NET への変数の引き渡し
関数 MATLABmagic は、double 型の 2 次元の行列を返します。エンジンは、返された MATLAB 2 次元 double 行列を、double[,] として宣言される .NET 変数 dbls に変換します。これにより、.NET プログラム内で dbls を使用できるようになります。MATLAB から .NET へのデータの変換の詳細については、.NET アプリケーションでの MATLAB データの処理を参照してください。
この例の C# コードは、次のとおりです。
using MathWorks.MATLAB.Engine;
using MathWorks.MATLAB.Exceptions;
using MathWorks.MATLAB.Types;
using System;
namespace MathWorks.MATLAB.Engine.ConsoleExamples {
public class Program {
public static void Main(string[] args) {
Console.Write("Starting MATLAB... ");
using (dynamic matlab = MATLABEngine.StartMATLAB()) {
Console.WriteLine("done.");
double[,] dbls = matlab.magic(3.0);
matlab.disp(new RunOptions(nargout: 0), dbls);
}
// Call when you no longer need MATLAB Engine in your application.
MATLABEngine.TerminateEngineClient();
}
}
}このコードでは、変数 dbls が double の 2 次元行列として定義されています。代替のサイズ定義は次のとおりです。
double[,] dbls = matlab.magic(3.0); // 3x3 double[,,] dbls = matlab.magic(3.0); // 3x3x1 Array dbls = matlab.magic(3.0); // 3x3
次のコードは、数値 3.0 を表すサイズ定義を示しています。
double x = matlab.eval(" 3.0 "); // double scalar
double[] y = matlab.eval(" 3.0 "); // double array, length 1
double[,,,] z = matlab.eval(" 3.0 "); // 1x1x1x1
Array q = matlab.eval(" 3.0 "); // 1x1共通言語ランタイム型への変換
.NET の IConvertible インターフェイスを使用して、参照型または値型の値を、等価な値をもつ共通言語ランタイム型に変換できます。
R2024a より前: C# コード | C# コード (R2024a 以降) |
|---|---|
MATLABArray retval = matlab.eval("int32(42)");
dynamic retvalDynamic = retval;
double d = retvalDynamic;
| MATLABArray retval = matlab.eval("int32(42)");
double d = Convert.ToDouble(retval);
|
いずれかの型の値をそれ以上のサイズをもつ別の型に変換するときは、拡張変換が行われます。変換が可逆であれば、.NET 型が MATLAB 型と完全に一致する必要はありません。
double d = matlab.eval("int32(42)");
float f = matlab.eval("uint8(42)");変換の詳細については、.NET での MATLAB 数値型を参照してください。
参考
MathWorks.MATLAB.Engine.MATLABEngine