将 MATLAB 类和函数映射到 C#
本指南详细介绍了 MATLAB® 类和函数如何映射到其相应的 C# 类和函数。通过涉及 MATLAB 类 MyPosition 和 MyRectangle(属于包 +shapes 的一部分)以及 MATLAB 函数 calculatearea 的示例,我们探索了由 compiler.build.dotNETAssembly 函数生成的 C# 代码文件,这些文件构成了 MATLAB 和 C# 之间的接口。
从高层次来看:
MATLAB 数据类型根据
arguments和properties模块中的类型规范映射到 C# 数据类型。MATLAB 包映射到同名的 C# 子命名空间。根命名空间对应于程序集的名称。
MATLAB 类映射到同名的 C# 结构。C# 代码文件使用以下命名模式生成:
。<MatlabPackageName>_<MatlabClassName>.csMATLAB 类的公共方法映射到同名 C# 结构的公共方法。
MATLAB 类的属性映射到 C# 结构中同名的属性。
MATLAB 包、类和函数
+shapes
这是一个包含两个类的 MATLAB 包:MyPosition 和 MyRectangle。
MyPosition
此类是 shapes 包的一部分,表示二维空间中的位置。它包含两个属性:X 和 Y,都是实数 double 精度值。
MyRectangle
该类也是 shapes 包的一部分,它代表一个矩形。它包含两个属性:UpperLeft 和 LowerRight,它们是 shapes.MyPosition 类的实例。该类还有两个方法:enlarge 和 show。enlarge 方法将矩形放大 n 倍,调整 UpperLeft 和 LowerRight 位置。show 方法显示 UpperLeft 和 LowerRight 位置的当前值。
calculatearea
函数 calculatearea 以 shapes.MyRectangle 的实例作为参量并计算矩形的面积。
C# 映射摘录
classdef MyRectangle properties UpperLeft (1,1) shapes.MyPosition LowerRight (1,1) shapes.MyPosition end methods function R = enlarge(R, n) arguments R (1,1) shapes.MyRectangle n (1,1) double {mustBeReal} end % code end function R = show(R) arguments R (1,1) shapes.MyRectangle end % code end end end | namespace CalculateArea.shapes{ public struct MyRectangle { ... ... private dynamic _objrep; private dynamic _matlab; public MyRectangle(MATLABProvider _matlab){ this._matlab = _matlab; _objrep = (MATLABArray)this._matlab.shapes.MyRectangle(new RunOptions(nargout:1)); } public CalculateArea.shapes.MyPosition UpperLeft { get => (MATLABObject) _matlab.matlab.@internal.engine.getProperty(_objrep, "UpperLeft"); set => _objrep = _matlab.matlab.@internal.engine.setProperty(_objrep,"UpperLeft",(MATLABObject)value); } public CalculateArea.shapes.MyPosition LowerRight { get => (MATLABObject) _matlab.matlab.@internal.engine.getProperty(_objrep, "LowerRight"); set => _objrep = _matlab.matlab.@internal.engine.setProperty(_objrep,"LowerRight",(MATLABObject)value); } public void show(){ _objrep.show(new RunOptions(nargout:0)); } public void show( out dynamic _R){ _R = (MATLABArray)_objrep.show(new RunOptions(nargout:1)); } public void enlarge(double n){ _objrep.enlarge(new RunOptions(nargout:0),n); } public void enlarge(double n, out MyRectangle R) { R = (CalculateArea.shapes.MyRectangle)_objrep.enlarge(new RunOptions(nargout:1),n); } ... } |
在 C# 中映射
namespace CalculateArea.shapes
MATLAB 包 shapes 映射到 C# 代码中的命名空间 CalculateArea.shapes。此处的根命名空间 CalculateArea 源自执行 compiler.build.dotnetAssembly 时指定的程序集名称。
struct MyPosition
MATLAB 类
MyPosition映射到同名的 C# 结构。MATLAB 类
X中的Y和MyPosition属性直接映射到 C# 结构中同名的属性。数据类型延续。C# 结构定义了一个构造函数,该构造函数接受
MATLABProvider对象并使用 MATLAB Runtime 初始化一个新的MyPosition实例。C# 结构包含在
MyPosition和MATLABObject之间进行转换的隐式运算符。这样就可以在任何需要MyPosition对象的地方使用MATLABObject对象,反之亦然。
struct MyRectangle
MATLAB 类
MyRectangle映射到同名的 C# 结构。MATLAB 类中的属性
UpperLeft和LowerRight属于shapes.MyPosition类型,直接映射到 C# 结构中同名的属性,这些属性属于CalculateArea.shapes.MyPosition类型。数据类型延续。C# 结构定义了一个构造函数,该构造函数接受
MATLABProvider对象并使用 MATLAB Runtime 初始化一个新的MyRectangle实例。方法:
a.为了
enlarge,MATLAB 方法采用double n作为参量并修改UpperLeft和LowerRight属性。C# 结构体具有一个enlarge方法,该方法也以double n作为参量,并修改 C# 结构的UpperLeft和LowerRight属性。b.对于
show,MATLAB 方法显示UpperLeft和LowerRight坐标。C# 结构也有一个show方法来执行相同的操作。
C# 结构包含在
MyRectangle和MATLABObject之间进行转换的隐式运算符。这样就可以在任何需要MyRectangle对象的地方使用MATLABObject对象,反之亦然。
calculatearea
在 C# 中,提供了两个名为 calculatearea 的方法,作为 MATLAB 函数的包装器。这些方法旨在通过 MATLABProvider 的实例调用 MATLAB 函数。
第一种方法 calculatearea(MATLABProvider _matlab, CalculateArea.shapes.MyRectangle rect) 不期望从 MATLAB 函数返回值。
第二种方法 calculatearea(MATLABProvider _matlab, CalculateArea.shapes.MyRectangle rect, out double r) 期望从 MATLAB 函数返回一个值,这与 MATLAB 函数一致。使用 out 参数 r 将计算出的面积传递出该方法。
在这两种 C# 方法中,shapes.MyRectangle 参数 rect 在传递给 MATLAB 函数之前被转换为 MATLABObject。这表明 shapes.MyRectangle 可以转换为兼容的 MATLAB 数据类型。
