MATLAB中的数组类型与.NET的数据类型是不一样的,将编译器生成的类库集成到.NET程序中时,需要首先考虑数据类型的转换问题。[大谦MATLAB,dqmatlab点com]
表3-2中列出了.NET类型转换为MATLAB数组的数据转换规则。注意:表3-2中列出的转换规则适用于标量、向量、矩阵和这里列出的本地类型构成的多维数组。
表3-2 本地.NET类型转换为MATLAB数组的转换规则
| 本地.NET类型 | MATLAB数组 | 解 释 |
|---|---|---|
| System.Double | double | |
| System.Single | single | 只有在makeDouble构造函数的变量设置为false时才可用。默认时为true,创建一个MATLAB double类型。 |
| System.Int64 | int64 | 只有在makeDouble构造函数的变量设置为false时才可用。默认时为true,创建一个MATLAB double类型。 |
| System.Int32 | int32 | 只有在makeDouble构造函数的变量设置为false时才可用。默认时为true,创建一个MATLAB double类型。 |
| System.Int16 | int16 | 只有在makeDouble构造函数的变量设置为false时才可用。默认时为true,创建一个MATLAB double类型。 |
| System.Byte | int8 | 只有在makeDouble构造函数的变量设置为false时才可用。默认时为true,创建一个MATLAB double类型。 |
| System.String | char | |
| System.Boolean | logical |
表3-3中列出了MATLAB数组类型转换为本地.NET类型的数据转换规则。
表3-3 MATLAB数组转换为本地.NET类型的转换规则
| MATLAB类型 | .NET类型 | .NET类型(类) | 解 释 |
|---|---|---|---|
| cell | N/A | MWCellArray | 元胞和结构数组没有对应的.NET类型 |
| structure | N/A | MWStructArray | 元胞和结构数组没有对应的.NET类型 |
| char | System.String | MWCharArray | 元胞和结构数组没有对应的.NET类型 |
| double | System.Double | MWNumericArray | 默认时为double类型 |
| single | System.Single | MWNumericArray | 默认时为double类型 |
| uint64 | System.Int64 | MWNumericArray | 不支持 |
| uint32 | System.Int32 | MWNumericArray | 不支持 |
| uint16 | System.Int16 | MWNumericArray | 不支持 |
| uint8 | System.Byte | MWNumericArray | 无 |
| logical | System.Boolean | MWLogicalArray | 无 |
| 函数句柄 | N/A | N/A | 无 |
| 对象 | N/A | N/A | 无 |
本地的.NET字符串转换为的MATLAB字符数组,其中,N等于.NET字符串的长度。.NET字符串数组转换为的字符数组,其中,M等于字符串数组中元素的个数,N等于数组中字符串的最大长度。高维字符串数组可作类似的转换。
库编译器提供了几个数据转换类来实现数据转换,包括:
MWArray
MWIndexArray
MWCellArray
MWCharacterArray
MWLogicalArray
MWNumericArray
MWStructArray
其中,MWArray类和MWIndexArray类为抽象类。其它类表示标准的MATLAB数组类型:元胞、字符、逻辑、数值和结构。每个类都提供了构造函数和一系列属性和方法来创建和访问对应的MATLAB数组的状态。
使用MWArray数据转换类,可以在不使用显式数据转换的情况下将大部分本地.NET数据作为参数直接进行传递。对于大部分本地数值和字符串类型,有一个隐式的运算符将本地类型转换为合适的MATLAB数组。
有一些数据类型如结构数组、结构数组和复数值数组等在.NET中没有对应的数据类型,表示这些数据类型,必须创建MWCellArray类,MWStructArray类或MWNumericArray类的实例。
所有从MATLAB函数返回到.NET方法的数据都表示相应的MWArray子类的一个实例。例如,MATLAB元胞数组时作为MWCellArray对象返回的。
在大多数情况下,如果一个本地.NET数组在C#程序中用作输入参数,库编译器会在将它传递给类的方法之前将它转换为合适的MWArray类的实例。库编译器可以将大部分CLS封装的字符串、数值类型或这些类型的多维数组转化为合适的MWArray类型。
例如,下面的.NET语句:
Result=theFourier.plotfft(3, data, interval);
其中,第3个变量interval的.NET本地类型是System.Double。库编译器会将该变量转换为MATLAB的 double MWNumericArray类型(这是一个包含MATLAB double型数组的打包器类)。
返回的数据不会自动转换为本地数组。如果需要对应的本地数组类型,调用ToArray方法,它将MATLAB数组转换为除元胞数组和结构数组外的合适的本地数据类型。
下面是一个演示如何将double值转换为 MWNumericArray类型的代码片段:
MWNumericArray arraySize=5.0;
magicSquare=magic.MakeSqr(arraySize);
double型值转换并赋给变量arraySize以后,以后不再需要转换就可以在MATLAB方法中使用arraySize变量。