使用 C# 和 MATLAB 类型进行数据转换
当 .NET 客户端通过服务器请求调用 MATLAB® 函数并在响应中收到结果时,数据会在 MATLAB 数据类型和 C# 数据类型之间进行转换。
使用 MATLAB 数据类型
您可以在 MATLAB 中使用多种数据类型或类。每个类都采用矩阵或数组的形式。您可以构建浮点和整数数据、字符和字符串以及逻辑真和假状态的矩阵和数组。结构和元胞数组提供了一种在同一数组中存储不同类型数据的方法。
注意
MATLAB Production Server™ 不支持函数句柄。
下图中圈出了基本的 MATLAB 类。
每个 MATLAB 数据类型在 C# 中都有一个特定的等效。有关这些一对一关系的映射,请参阅 MATLAB 类型与 C# 类型之间的转换。
标量数值类型强制
只要没有数据或精度丢失,标量数值 MATLAB 类型就可以分配给多个 .NET 数值类型。
下表描述了标量数值强制的类型兼容性。
MATLAB 与 .NET 数值类型兼容性
MATLAB 类型 | .NET 类型 | C# 类型 |
---|---|---|
uint8 | System.Byte , System.Int16 , System.UInt16 , System.Int32 , System.UInt32 , System.Int64 , System.UInt64 , System.Single , System.Double | byte |
int8 | System.SByte , System.Int16 , System.Int32 , System.Int64 , System.Single , System.Double | sbyte |
uint16 | System.UInt16 , System.Int32 , System.UInt32 , System.Int64 , System.UInt64 , System.Single , System.Double | ushort |
int16 | System.Int16 , System.Int32 , System.Int64 , System.Single , System.Double | short |
uint32 | System.UInt32 , System.Int64 , System.UInt64 , System.Single , System.Double | uint |
int32 | System.Int32 , System.Int64 , System.Single , System.Double | int |
uint64 | System.UInt64 , System.Single , System.Double | ulong |
int64 | System.Int64 , System.Single , System.Double | long |
single | System.Single , System.Double | float |
double | System.Double , System.SByte , System.Byte , System.Int16 , System.UInt16 , System.Int32 , System.UInt32 , System.Int64 , System.UInt64 , System.Single | double |
维度强制转换
在 MATLAB 中,维数是基本数据类型的一个属性,并且不会像在 .NET 中那样增加数据类型的数量。例如,在 C# 中,double
、double[]
和 double[,]
是三种不同的数据类型。在 MATLAB 中,只有 double
数据类型,并且可能有一个标量实例、一个向量实例或一个多维实例。例如,如果您的 MATLAB 函数返回一个三维双精度数组,则您的 C# 函数将其返回值声明为 C# 三维 double
数组
C# 签名 | 从 MATLAB 返回的值 |
---|---|
double[,,] foo() | ones(1,2,3) |
如何定义 MATLAB 函数和相应的 C# 方法签名决定了是否强制输出数据(使用填充或截断)。
.NET 客户端 API 会自动为您执行强制操作。本节介绍填充和截断遵循的规则。
注意
支持 C# 类型的多维数组。不支持交错数组。
填充
当 C# 方法的返回类型的维度数大于 MATLAB 方法的维度数时,MATLAB 返回类型的维度将用 1 (1
) 填充,以匹配 C# 中所需的输出维度数。
下表提供了填充的示例。例如,当您的 MATLAB 函数返回二维矩阵但您的 C# 函数声明四维数组返回值时,MATLAB 矩阵将变成具有两个尾随奇异维度的四维数组。
C# 方法返回类型填充
MATLAB 函数 | C# 方法签名 | MATLAB 中的维度 | C# 中的维度 |
---|---|---|---|
| double[,,,] foo() | size(a) 为 [2,3] | 数组将以大小 2,3,1,1 的形式返回 |
截断
当 C# 方法的返回类型的维度少于 MATLAB 方法的返回类型的维度时,MATLAB 返回类型的维度将被截断以匹配 C# 中所需的输出维度数。仅当 MATLAB 数组的额外维度仅有 1 (1
) 的值时才有可能。
为了在 C# 中计算适当的维度数,多余的维度将按以下顺序截断:
从数组末尾
从数组开头
从数组中间(从前到后扫描)。
下表提供了截断的示例。
MATLAB 如何截断 C# 方法返回类型
MATLAB 函数 | C# 方法签名 | MATLAB 中的维度 | C# 中的维度 |
---|---|---|---|
| double[,] foo() | size(a) 为 [1,2,1,1,3,1] | 数组将以大小 2,3 的形式返回 |
以下是使用 double
数值类型缩短维度的一些示例。
在 MATLAB 和 C# 数据转换中截断维度
MATLAB 数组维度 | 声明的输出 C# 类型 | 输出 C# 维度 |
---|---|---|
1 x 1 | double | 0(标量) |
2 x 1 | double[] | 2 |
1 x 2 | double[] | 2 |
2 x 3 x 1 | double[,] | 2 x 3 |
1 x 3 x 4 | double[,] | 3 x 4 |
1 x 3 x 4 x 1 x 1 | double[,,] | 1 x 3 x 4 |
1 x 3 x 1 x 1 x 2 x 1 x 4 x 1 | double[,,,] | 3 x 2 x 1 x 4 |
空(零)维度
将 C# 空值传递给 MATLAB
当 null
从 C# 传递到 MATLAB 时,它将始终被编组到 MATLAB 中的 []
中,作为零乘零 (0 x 0
) double
。这与 C# 中使用的声明的输入类型无关。例如,以下所有方法都可以接受 null
作为输入值:
void foo(String input); void foo(double[] input); void foo(double[,] input);
在 MATLAB 中,null
将被接收为:
[] i.e. 0x0 double
将 MATLAB 空值传递给 C#
MATLAB 中的空数组至少在一维中分配有一个零(0
)。
例如,您可以通过将 function a = foo
分配给以下任意值来从 a
返回一个空数组:
a = []; a = ones(0); a = ones(0,0); a = ones(1,2,0,3);
对于上述所有情况,空的 MATLAB 数据都会作为 null
返回到 C#。
例如,在 C# 中,当 MATLAB 函数返回空数组时,以下签名将返回 null
。
double[] foo(); double[,] foo();