主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

使用 C# 和 MATLAB 类型进行数据转换

当 .NET 客户端通过服务器请求调用 MATLAB® 函数并在响应中收到结果时,数据会在 MATLAB 数据类型和 C# 数据类型之间进行转换。

使用 MATLAB 数据类型

您可以在 MATLAB 中使用多种数据类型或类。每个类都采用矩阵或数组的形式。您可以构建浮点和整数数据、字符和字符串以及逻辑真和假状态的矩阵和数组。结构和元胞数组提供了一种在同一数组中存储不同类型数据的方法。

注意

MATLAB Production Server™ 不支持函数句柄。

下图中圈出了基本的 MATLAB 类。

Fundamental MATLAB classes

每个 MATLAB 数据类型在 C# 中都有一个特定的等效。有关这些一对一关系的映射,请参阅 MATLAB 类型与 C# 类型之间的转换

标量数值类型强制

只要没有数据或精度丢失,标量数值 MATLAB 类型就可以分配给多个 .NET 数值类型。

下表描述了标量数值强制的类型兼容性。

MATLAB 与 .NET 数值类型兼容性

MATLAB 类型.NET 类型C# 类型
uint8System.Byte, System.Int16, System.UInt16, System.Int32, System.UInt32, System.Int64, System.UInt64, System.Single, System.Doublebyte
int8System.SByte, System.Int16, System.Int32, System.Int64, System.Single, System.Doublesbyte
uint16System.UInt16, System.Int32, System.UInt32, System.Int64, System.UInt64, System.Single, System.Doubleushort
int16System.Int16, System.Int32, System.Int64, System.Single, System.Doubleshort
uint32System.UInt32, System.Int64, System.UInt64, System.Single, System.Doubleuint
int32System.Int32, System.Int64, System.Single, System.Doubleint
uint64System.UInt64, System.Single, System.Doubleulong
int64System.Int64, System.Single, System.Doublelong
singleSystem.Single, System.Doublefloat
doubleSystem.Double, System.SByte, System.Byte, System.Int16, System.UInt16, System.Int32, System.UInt32, System.Int64, System.UInt64, System.Singledouble

维度强制转换

在 MATLAB 中,维数是基本数据类型的一个属性,并且不会像在 .NET 中那样增加数据类型的数量。例如,在 C# 中,doubledouble[]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# 中的维度

function a = foo

a = ones(2,3);

double[,,,] foo() size(a)[2,3]数组将以大小 2,3,1,1 的形式返回

截断

当 C# 方法的返回类型的维度少于 MATLAB 方法的返回类型的维度时,MATLAB 返回类型的维度将被截断以匹配 C# 中所需的输出维度数。仅当 MATLAB 数组的额外维度仅有 1 (1) 的值时才有可能。

为了在 C# 中计算适当的维度数,多余的维度将按以下顺序截断:

  1. 从数组末尾

  2. 从数组开头

  3. 从数组中间(从前到后扫描)。

下表提供了截断的示例。

MATLAB 如何截断 C# 方法返回类型

MATLAB 函数C# 方法签名 MATLAB 中的维度C# 中的维度

function a = foo

a = ones(1,2,1,1,3,1);

double[,] foo()size(a)[1,2,1,1,3,1]数组将以大小 2,3 的形式返回

以下是使用 double 数值类型缩短维度的一些示例。

MATLAB 和 C# 数据转换中截断维度

MATLAB 数组维度声明的输出 C# 类型输出 C# 维度
1 x 1double0(标量)
2 x 1double[]2
1 x 2double[]2
2 x 3 x 1double[,]2 x 3
1 x 3 x 4double[,]3 x 4
1 x 3 x 4 x 1 x 1double[,,]1 x 3 x 4
1 x 3 x 1 x 1 x 2 x 1 x 4 x 1double[,,,]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();

另请参阅

主题