从 .NET 执行 MATLAB 函数
当您从 .NET 调用 MATLAB® 函数时,您可以将 .NET 变量传递给该函数。如果 MATLAB 函数返回输出变量,引擎会将其从 MATLAB 转换为 .NET。
有关如何设置和编译 .NET 引擎程序的信息,请参阅测试您的 .NET 开发环境。
将变量从 .NET 传递给 MATLAB
在此示例中,您使用 MATLAB linspace 函数创建一个一维双精度数组,并使用 reshape 重构元素。有关将数据从 .NET 转换为 MATLAB 的信息,请参阅Pass .NET Data Types to MATLAB Functions。
此示例的 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
MATLAB magic 函数返回一个双精度类型的二维矩阵。引擎将返回的 MATLAB 二维双精度矩阵转换为 .NET 变量 dbls(声明为 double[,])。然后,您可以在 .NET 程序中使用 dbls。有关将数据从 MATLAB 转换为 .NET 的信息,请参阅Handle MATLAB Data in .NET Applications。
此示例的 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[,] 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)");有关转换信息,请参阅 MATLAB Numeric Types in .NET。
另请参阅
MathWorks.MATLAB.Engine.MATLABEngine