C# 中的 Marshal MATLAB 结构 (structs)
结构(或 structs)是 MATLAB® 数组,其元素通过文本字段指示符访问。
结构由称为字段的数据容器组成。每个字段存储某种 MATLAB 数据类型的数组。每个字段都有一个唯一的名称。
创建 MATLAB 结构体
MATLAB 结构体是名称-值对的有序列表。您可以通过定义 .NET 结构体或类在 C# 中表示它们,只要它具有与 MATLAB 结构体相对应的 public
字段或属性。.NET 结构体或类中的字段或属性可以具有可转换为任何 MATLAB 数据类型(包括元胞数组或其他结构体)的值。本文中的示例同时使用了 .NET struct
和类。
在 MATLAB 中,创建一个包含 name
、score
和 grade
的结构体来存储学生的信息。
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+'
S
)。S = name: 'Ed Plum' score: 83 grade: 'B+'
S
中插入其他元素来创建多维结构体数组。以下代码创建一个尺寸为 (1,3)
的结构体数组。S(2).name = 'Tony Miller'; S(2).score = 91; S(2).grade = 'A-';
S(3).name = 'Mark Jones'; S(3).score = 85; S(3).grade = 'A-';
使用 .NET 结构和类
您可以创建 .NET 结构体和类来在数据和 MATLAB 结构体之间编组数据。
.NET struct
Student
是 .NET struct
的一个示例,它使用 sortstudents
字段和属性将 .NET 类型编组为 MATLAB 函数的输入,例如 public
。请注意公开声明的字段 name
以及属性 grade
和 score
。
除了使用 .NET struct
之外,请注意以下事项:
Student
也可以定义为一个类。尽管在此示例中使用了
public
字段和属性的组合,但您也可以仅使用字段或属性。
C# 类 SimpleStruct
使用 public
可读属性作为 MATLAB 的输入,并在编组时使用 public
构造函数作为 MATLAB 的输出。
当此类作为输入传递给 MATLAB 函数时,它会生成一个 MATLAB 结构体,其中包含字段 Field1
和 Field2
,它们被定义为 public
可读属性。当从 MATLAB 传递具有字段名称 Field1
和 Field2
的 MATLAB 结构时,它将用作目标 .NET 类型(分别为 string
和 double
),因为它具有带有输入参数 Field1
和 Field2
的构造函数。
MATLAB 函数 sortstudents
接受 student
结构体数组并按学生分数升序对输入数组进行排序。struct
数组中的每个元素代表有关 student
的不同信息。
提供了 C# 接口 StudentSorter
和方法 sortstudents
来显示 C# 中的等效功能。
您的 .NET 结构体和类必须遵守特定要求,这些要求既基于作用域级别(例如,字段和属性,而不是构造函数),也基于您是将 .NET 类型编组到 MATLAB 结构体,还是反向编组。有关详细信息,请参阅使用 .NET 结构和类。
.NET 接口 StudentSorter
与方法 sortstudents
使用先前定义的 .NET Student
结构进行输入和输出。在 .NET 中编组用于输入和输出的结构时,Student
结构或类必须包含在 MWStructureList
属性中。有关此自定义属性的更多信息,请参阅位于
的 .NET API 文档。$MPS_INSTALL
/client
运行该应用程序时,将生成以下输出:
Unsorted list of students : Tony Miller : A : 90 Ed Plum : B+ : 80 Mark Jones : A- : 85 Sorted list of students : Ed Plum : B+ : 80 Mark Jones : A- : 85 Tony Miller : A : 90 Press any key to continue . . .
使用属性
除了使用 使用 .NET 结构和类 中描述的技术之外,属性还提供了多种方法来在 .NET 类型和 MATLAB 结构体之间进行编组。
MATLAB Production Server™ 定义的属性 MWStructureList
可以限定在字段、属性、方法或接口级别。
在下面的示例中,MATLAB 函数将包含各种 MATLAB cell
数据类型的 struct
数组(向量)作为输入,并返回包含输入 cell
的修改版本的 struct
数组(向量)作为输出。
使用两种 .NET 结构类型定义 cell
数组:
如果不使用 MWStructureList
属性,接口 StructExample
中的 C# 方法签名如下:
public interface StructExample { public object[] modifyinput(object[] cellArrayWithStructs); }
请注意,此签名并未提供有关 cellArrayWithStructs
在运行时包含的结构体类型的信息。但是,通过使用 MWStructureList
属性,您可以直接在方法签名中定义这些类型:
public interface StructExample { [MWStructureList(typeof(Struct1), typeof(Struct2))] public object[] modifyinput(object[] cellArrayWithStructs); }
MWStructureList
属性的范围可以为:
方法属性
在此示例中,属性 MWStructureList
用作方法属性,用于编组输入和输出类型。
public interface StructExample { [MWStructureList(typeof(Struct1), typeof(Struct2))] public object[] modifyinput(object[] cellArrayWithStructs); }
在此示例中,结构类型 Struct1
和 Struct2
未向方法 modifyinputNew
公开,因为 modifyinputNew
是单独的方法签名
public interface StructExample { [MWStructureList(typeof(Struct1), typeof(Struct2))] public object[] modifyinput(object[] cellArrayWithStructs); public object[] modifyinputNew(object[] cellArrayWithStructs); }
接口属性
当在接口级别使用时,属性由接口的所有方法共享。
在下面的示例中,modifyinput
和 modifyinputNew
方法共享接口属性 MWStructureList
,因为该属性是在 interface
声明之前定义的。
[MWStructureList(typeof(Struct1), typeof(Struct2))] public interface StructExample { public object[] modifyinput(object[] cellArrayWithStructs); public object[] modifyinputNew(object[] cellArrayWithStructs); }
字段和属性特性
使用 public
字段或 public
属性编写接口。
您可以使用字段和属性以三种方式表示这种类型的 .NET struct
:
在字段上:
使用
public
字段和MWStructureList
属性:public struct StructWithinStruct { [MWStructureList(typeof(Struct1), typeof(Struct2))] public object[] cellArrayWithStructs; }
在属性处,对于
get
和set
方法:使用
public
属性和MWStructureList
特性:public struct StructWithinStruct { private object[] arr; [MWStructureList(typeof(Struct1), typeof(Struct2))] public object[] cellArrayWithStructs { get { return arr; } set { arr = value; } } }
在属性处,对于
get
或set
方法,取决于此结构是否将用作 MATLAB 的输入或 MATLAB 的输出:public struct StructWithinStruct { private object[] arr; public object[] cellArrayWithStructs { [MWStructureList(typeof(Struct1), typeof(Struct2))] get { return arr; } [MWStructureList(typeof(Struct1), typeof(Struct2))] set { arr = value; } } }
注意
最后两个示例显示了属性 (property) 使用的特性 (attributes),产生相同的结果。