Matlab 数据类型与.NET 数据类型转换
by-GalaxyGap 2012-12-11
用 Matlab 写算法还是有很多优势的,具体表现在以下几个方面:1)Matlab
的内部函数是用 C 语言写的,虽然 M 语言是解释性语言,但调用内部函数进行
计算还是很快的。2)一般我们写算法都会涉及到很多基本的数学操作,比如说矩
阵相乘、矩阵求逆、求特征值、满足特定分布的随机数生成、基本统计量的计算
等等。这些基本的数学操作可以说是我们算法的基本组成部分,我们可以使用任
何一种语言编写函数一一实现这些基本的数学操作,然后由这些最基本的数学操
作构建我们更复杂的算法。但是我们有没有必要这么做呢?显然没有!因为这些
基本的数学操作虽然原理我们都懂,自己亲自动手实现也不会太难,但它太耗时,
我们自己写出来的东西可能也不稳健!耗时这个很好理解了,即使是一个很简单
的矩阵求逆我们也要写一大段的代码,费劲心思去进行流程设计和步骤分解,编
写代码的时候也要小心翼翼地处理各种细节。可以说从最底层开始写算法是非常
费神的,等你算法写好了,估计也已经累得半死,然后项目也早过期了。更严重
的是自己写出来的基本模块没有一些数学软件提供的模块那么稳健,可能存在某
些漏洞或 bug,这样程序调试起来又更费力气。可以说从最底层写算法是一件吃
力不讨好的事情。相反若在某些数学软件的平台上写算法,我们的工作就会省去
一大半,而且写出来的算法也更稳健。比如说在 Matlab 上我们要实现矩阵求逆,
只需要调用一个函数便可得到结果。而且这个函数应该是比较稳健的,不会出什
么意外。更重要的是,Matlab 平台不仅仅是提供了一些最基本的数学操作,还
在此基础上实现了一些更高级的模块,比如说求解线性方程组、曲线拟合、积分
微分等。这些更高级的模块也都可以成为我们算法的组成部分。也即是我们的算
法可以在更粗的粒度上来构建,而不局限于从基本的数学操作上开始构建。3)
Matlab 支持将 M 文件编译成其他平台能够使用的组件或者说模块,也即是
Matlab 能够和其他平台通信,只需要安装一个 200 多兆的 MCR 即可。
当然什么东西都不是十全十美的,用 Matlab 写算法也有它的缺点,特别是
当我们想把 Matlab 中写的算法应用到其他平台上时,它的缺点就体现得更明显。
1)首先是速度的问题,也许我们的算法直接在 Matlab 平台上运行的时候速度是
很快的,但应用到其他平台上的时候就很慢了,这是因为 Matlab 和其他平台通
信的时候耗时比较多,尤其是和.NET 通信的时候。2)其次 Matlab 和其他平台通
信的时候涉及到数据转换,因为不同平台的数据类型一般不相同。这种数据类型
的转换有时候比较复杂,不便于不同平台下的程序员交流。比如说一个熟悉
Matlab 平台的算法程序员把算法写好并编译成.NET 程序集之后交给一个不熟悉Matlab 环境的.NET 程序员去用这个算法。在这种情况下,也许 Matlab 程序员很
清楚他的算法需要什么样的数据作为输入,然后输出了什么样的数据,但.NET
程序员却未必对这一算法的输入输出了解得那么清楚了。没有搞清楚输入输出想
要应用这一算法就有点勉为其难。因此 Matlab 与.NET 之间的数据交换就显得尤
为重要,只有能理解两个平台的数据类型以及他们之间的转换过程才能顺利地将
两个平台结合在一起。本文以下就专门讨论 Matlab 平台与.NET 平台的数据交换
过程。开始之前先提醒一下:Matlab 平台与.NET 平台的数据交换全是由
MathWorks.MATLAB.NET.Arrays 这一命名空间下的类和接口实现的。这是一个由
Matlab 为支持.NET 平台开发的.NET 中的方法集。因此我们要想搞清楚这两个平
台之间是如何通信的,除了对两个平台的数据类型由足够的了解之外,还要深谙
这个命名空间下的各种方法的作用。
Matlab 中的 M 文件编译成.NET 可用的程序集
我们首先从 Matlab 这边开始,看看在 Matlab 这边写好的函数是怎样一步步
变成.NET 中可用的函数。假设我们在 Matlab 中写好了这样一个简单函数:
function y = Sum(x)
y = sum(x);
关于 sum 这个 Matlab 内部函数的作用,大家可以在 Matlab 的 help 中查到,
这里就不具体说了。只需要看看在 Matlab 中它的输入输出即可。比如说输入这
样一个矩阵(我们知道 Matlab 中所有的数据类型都是以矩阵的形式表示的,即
使是一个单一值,Matlab 中也把它表示成 1×1 的矩阵):
data = [1 2 3;4 5 6; 7 8 9; 10 11 12];
data =
1 2 3
4 5 6
7 8 9
10 11 12
可以看到这是一个 4×3 的矩阵。调用 Sum 函数之后得到的结果为:
y = Sum(data)
y =
22 26 30
这个时候 y 已经是一个 1×3 的矩阵了。我们再用 Sum 处理一下这个 y 得到的结
果是:
Sum(y) ans =
78
可以看到就这么一个简单的函数在 Matlab 中它的输入输出可是变化多多。它可
以接受一个多行多列的矩阵,然后针对每一列求和(第一次调用 Sum)得到一个
一行多列的矩阵;也可以接受一个一行 n 列的矩阵,然后针对该行求和得到一个
一行一列的矩阵。这对于看惯了固定输入类型的.NET 程序员来说看着确实别扭,
起码我是这样的。当然这实际上一种重载了,.NET 中也能实现,只是在.NET 中
每一个重载函数我们都会显式地写出来,用的时候也会有提示,而 Matlab 中却
是一个函数搞定。大有一种:参数你随便传,我看情况处理,但我是怎么处理的
不明显告诉你,我把它放在内心里。说白了,它的重载函数都隐藏起来了。
好,现在我们把这个函数编译成.NET 中能调用的程序集。编译的过程如下:
1 在 Matlab 的 Command Window 中运行 deploytool 命令调出编译和打包界面,
将工程名字改成 SumComp,类型选择.NET Assembly。
2 在 Build 标签下单击 Class 选项中的 Add Class,把 Class1 改成 SumClass,单击
Add File 把前面写好的 M 文件 Sum.m 添加到该类下。
3 找到 Settings(Matlab 2012b 版本的可以单击右上角那个齿轮,在弹出的菜单中
选择 Settings),打开 Project Settings 对话框,并在.NET 标签下选择 Microsoft
Framework 为 4.0(这一步因人而异了,看你接下来用哪一版本的 VS 平台做测试,
我的是 VS2010,对应的.NET Framework 是 4.0,其他的只要选择对应的 Framework
就行了。这一步是为了将 Matlab 编译生成的程序集的.NET Framework 版本与你
测试程序的.NET Framework 版本对应起来,不对应的话是生成的程序集在引用的
时候会出错的。)
4 点击编译,生成.NET 可以引用的程序集。这一步完成之后该工程会在工程文件
夹下生成两个子文件夹 distrib 和 src,打开 distrib 文件夹可以看到四个文件,这
就是生成的程序集。可以查看那个 readme.txt 文件以了解每个文件的作用,我们
接下来在测试程序中需要引用的就是那个 SumComp.dll。
到这里Matlab中的函数就转化成了.NET中可以引用的程序集了。Matlab中的Sum
函数就包含在了 Sumcomp.dll 及其相关的文件里。这以程序集包含了一个
SumClass 类,类内包含着一个叫 Sum 的函数,命名空间是 SumComp。接下来就
可以在.NET 的测试程序中使用这个函数了。
在.NET 中测试 Matlab 数据类型与.NET 数据类型的交换
1 首先在 VS 中新建一个控制台应用程序,添加 MWArray 组件引用(这一组件如
果顺利地被你的 VS 识别了的话,在你添加引用的时候会存在于.NET 标签下,你直 接 添 加 引 用 即 可 ; 若 这 个 标 签 下 没 有 , 则 自 己 定 位 到 C:\Program
Files\MATLAB\R2012b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll,将该 dll
添加到引用即可)。这一组件即是前面说的 Matlab 为支持.NET 而开发的一套数据
交换接口。
2 其次还要添加刚刚生成的组件引用,也即定位到 distrib 文件夹下添加对
SumComp.dll 的引用,或者你把这个文件下的所有文件拷贝到当前工程的目录下,
再对 SumComp.dll 添加引用。
3 接下来使用命名空间,在测试程序的 using 区域内添加以下两个 using:
using SumComp;
using MathWorks.MATLAB.NET.Arrays;
好,以上 这些步骤都完成之后可以开始测试 Matlab 与.NET 之间的数据交换
了。
不过在测试之前先别忙,我们先来看看 Matlab 编译生成的组件 SumComp.dll
帮我们把 Matlab 中的数据转换到了哪一步。SumComp.dll 这个组件是 Matlab 的
最后产物,后面的事情就交给.NET 了,所以很有必要先研究下这个 SumComp.dll
所包含的方法到底是个什么样的形式,其输入输出参数都是些什么。双击引用中
的 SumComp 可以打开对象浏览器,我们可以一级级定位到最后 SumClass 包含的
函数,在这里我们可以看到编译之后的 Sum 函数的庐山真面目,这里 Matlab 一
共生成了 5 个 Sum 的重载函数!从一个 M 文件中的 Sum 函数变成 5 个.NET 里的
Sum 的重载函数,是不是有点出乎意料!这五个重载函数分列如下:
①public void Sum(int
numArgsOut
, ref MathWorks.MATLAB.NET.Arrays.MWArray[]
argsOut
,
MathWorks.MATLAB.NET.Arrays.MWArray[]
argsIn
)
SumComp.SumClass 的成员
②public MathWorks.MATLAB.NET.Arrays.MWArray[] Sum(int
numArgsOut
,
MathWorks.MATLAB.NET.Arrays.MWArray x)
SumComp.SumClass 的成员
③public MathWorks.MATLAB.NET.Arrays.MWArray[] Sum(int
numArgsOut
)
SumComp.SumClass 的成员
④public MathWorks.MATLAB.NET.Arrays.MWArray
Sum(MathWorks.MATLAB.NET.Arrays.MWArray x)
SumComp.SumClass 的成员
⑤public MathWorks.MATLAB.NET.Arrays.MWArray Sum()
SumComp.SumClass 的成员
看到了吧,几乎大部分参数都是 WMArray 类型的,也即 WMArray 这种数据
类型是 Matlab 数据类型和.NET 数据类型相互转换的中间数据类型!而且 Matlab
并不是一对一地把一个函数编译成了另一个相同形式的函数,而是编译成了多个
重载函数以供用户以不同的调用方式调用。但我们现在有一个疑问就是:是否针对每种特定的输入,每个重载函数都可以调用,并且能实现同样的结果。后一点
非常重要,因为相同的输入,调用同样功能的函数,必须要得到相同的输出。
首先我们来看看是不是针对各种各样的输入,每个函数都可以调用。回答显
然是否定的。因为我们可以看到第五个重载函数没有输入参数,只有输出参数,
显然在我们想输入数据的时候,是不能够通过调用第五个函数来实现的。第五个
函数看起来并没有任何作用,我们不清楚它到底从哪里引用数据,然后输出结果。
接下来我们就来一一测试剩下的 4 个重载函数。在 Main 函数中编写以下代码:
double[,] data = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};
MWNumericArray dataArray = new MWNumericArray(data);
MWNumericArray resultArray;
SumClass mySum = new SumClass ();
resultArray = (MWNumericArray)mySum.Sum(dataArray);
double[,] result =(double[,]) resultArray.ToArray();
for(int i = 0; i<result.GetLength (0);i++)
for (int j = 0; j < result.GetLength(1); j++)
{
Console.WriteLine("result[{0},{1}] = {2}", i, j, result[i, j]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
我们一步步调试这段代码。首先定义并初始化一个.NET 中的二维数组 data,
该二维数组的维度是 4×3,这个数组将作为我们求和函数的输入。然后我们要
把这个.NET 中的二维数组转化成 MWArray 的中间类型,因为 Matlab 生成的函数
接收的是 MWArray 类型的数据,MWArray 是 Matlab 与.NET 进行数据交换的中间
类型。这里我们定义的是 MWNumericArray 类型,它是从 MWArray 派生的类型,
在传递参数的时候同样可用。之后很关键的一个问题就是如何把 double[,]转换成
MWNumericArray 了,这里非常简单,只需要在实例化 MWNumericArray 的时候
将 data 作为 MWNumericArray 构造函数的参数就行了。这一个类的构造函数非
常强大,有 54 个重载构造函数,几乎可以把你在.NET 中的任何数值型数据类型
转成在 Matlab 中与该数据类型结构相似的数据类型。比如说这里传递的是一个
4×3 的二维数组,经过这样一个转化之后,相当于 dataArray 也代表了一个 Matlab
中的 4×3 的数组。然后再定义一个 MWNumericArray 类型的 resultArray 变量来
接收结果。接下来实例化 SumClass 并调用 Sum 函数。需要注意的是这里调用的
Sum 函数是和我们在 Matlab 中写的 Sum 函数形式最相近的那个,也即是一个输
入参数一个输出参数,输入参数包含输入数据,输出参数包含结果数据。这个函
数就是上面所列函数的第四个。另外函数调用之后返回的结果是 MWArray 类型的,
但 我 们 知 道 返 回 的 结 果 肯 定 是 数 值 型 的 , 所 以 前 面 我 们 定 义 的 是MWNumericArray 来接收它。MWArray 是 MWNumericArray 的基类,从 MWArray 到
MWNumericArray 的转换是向下 cast(还是向上?搞不清楚了,反正从基类到派
生类的 cast 需要显式转换,反之可以进行隐式转换),所以要进行显式转换。获
得 Sum 函数的结果后,还要倒过来把中间类型的结果转换到.NET 平台上的结果,
也即是把 MWNumericArray 类型的结果转成 double[,]的结果。这一步也很简单,
直接调用 MWNumericArray 的 ToArray 方法。这个方法有两个重载,第一个不用
输入任何参数;第二个需要指定是输出 MWNumericArray 所含数据的实部还是虚
部。因为我们的输入数据不是复数,所以只需调用第一个重载就够了。最后打印
出结果:
result[0,0] = 22
result[0,1] = 26
result[0,2] = 30
Press enter to finish
可以看到最后的输出结果和 Matlab 中的输出结果是一致的,都是一个 1×3 的矩
阵。
以上是对整一个数据转换流程的说明,Matlab 与.NET 的数据交换基本上都是
按照这个流程在走的,只是中间还有一些细节的东西需要交代。
1 输入数据的维度问题
1)若输入一维数组
//输一维数组,调用标准Sum函数
double[] data = new double[]{1,2,3,4,5,6,7,8,9,10};
MWNumericArray dataArray = new MWNumericArray(data);
MWNumericArray resultArray;
SumClass mySum = new SumClass();
resultArray = (MWNumericArray)mySum.Sum(dataArray);
double[,] result = (double[,])resultArray.ToArray();
for (int i = 0; i < result.GetLength(0); i++)
for (int j = 0; j < result.GetLength(1); j++)
{
Console.WriteLine("result[{0},{1}] = {2}", i, j, result[i, j]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
此时 dataArray 是 1×10 的数据,见图 1,也即.NET 中的一维数组被转换成了
Matlab 中的行向量。我们知道在 Matlab 中对行向量使用 sum 函数最后会得到一
个值,到这个值在 Matlab 中实际上是一个 1×1 的矩阵,所以我们可以预计结果变量 resultArray 也应该是 1×1 的矩阵,事实也确实如此,见图 2:
图 1 一维数组被转换成 MWNumericArray 之后的维度
图 2 一维数组作为输入产生的结果数据的维度
最后的输出结果如下:
result[0,0] = 55
Press enter to finish
2)若输入高维数组
在.NET 平台上我们对高维数组的使用比较少,但在 Matlab 中使用得还是比较频
繁的,所以这里给出一个.NET 中的三维数组如何传递给 Matlab 的例子:
///输入三维数组,调用标准Sum函数
double[,,] data = new double[,,]{{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}} };
MWNumericArray dataArray = new MWNumericArray(data);
MWNumericArray resultArray;
SumClass mySum = new SumClass();
resultArray = (MWNumericArray)mySum.Sum(dataArray); double[,,] result = (double[,,])resultArray.ToArray();
for (int i = 0; i < result.GetLength(0); i++)
for (int j = 0; j < result.GetLength(1); j++)
for (int k = 0; k < result.GetLength(2);k++ )
{
Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,
j, k]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
三维数组 data 初始化之后在.NET 中的表示是这样的,见图 3
图 3 三维数组 data[2,2,3]在.NET 中的表示形式
在.NET 中,二维的情况下,我一般认为行代表第二维,列代表第一维,也即行
是高维,列是低维,当然你也可以把它反过来。但要记住的是 GetLength(0)方法
返回的是行数,GetLength(1)返回的是列数,二行三列的数组表示形式是这样的
data[2,3]。在三维的情况下,仍然将最低维(第一维)认为是列所在的维,第二
维是行所在的维,再往上才是第三维。所以三个维度从高往低分别为 2,2,3 的高
维数组在.NET 中的表示形式是 data[2,2,3]。这个时候 GetLength(0)获得的是第三
维的维度,GetLength(1)获得的是第二维的,而 GetLength(2)获得的才是第一维的。
三维数组可以看成是多个同样结构的二维数组拼在一起。更高维的数组以此类推。
在 Matlab 中高维数组的表示和.NET 中不同。将.NET 中的 data[2,2,3]转换成
MWNumericArray 类型的 dataArray 后,其表示形式如图 4 所示。Length(0)获得的
是行数,length(1)获得的是列数,length(2)获得的才是第三维的维度。
图 4 data[2,2,3]转换成 MWNumericArray 类型后的变量 dataArray
调用 Sum 函数返回的结果 resultArray,见图 5。可以看到 Matlab 中的 sum 函数
是沿着列维作用的,也即是将每一列值加起来。最后仍然返回一个三维矩阵,只
不过维度已经变成 1,3,2 了(Matlab 中的表示形式,第一维的维度是 1,第二维
3,第三维 2,可以理解为 2 个一行三列矩阵的拼接)。
图 5 求和之后返回的 MWNumericArray 类型的结果变量 resultArray
最后将 MWNumericArray 类型表示的三维矩阵转换成.NET 中的三维数组,如图 6
所示。输出结果如下:
result[0,0,0] = 5
result[0,0,1] = 7
result[0,0,2] = 9
result[1,0,0] = 17
result[1,0,1] = 19
result[1,0,2] = 21 Press enter to finish
图 6 求和并转换之后的结果数组 result
2 其他 Sum 重载函数的测试
1)调用第一个重载函数
第一个重载函数原型:
public void Sum(int
numArgsOut
, ref MathWorks.MATLAB.NET.Arrays.MWArray[]
argsOut
,
MathWorks.MATLAB.NET.Arrays.MWArray[]
argsIn
)
//输入三维数组,调用第一个重载函数
double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },
{ 10, 11, 12 } } };
MWArray[] argin = new MWNumericArray[1];
argin[0] = new MWNumericArray (data);
MWArray[] argout = new MWNumericArray[1];
SumClass mySum = new SumClass();
mySum.Sum(1, ref argout,argin);
double[, ,] result = (double[, ,])argout[0].ToArray();
for (int i = 0; i < result.GetLength(0); i++)
for (int j = 0; j < result.GetLength(1); j++)
for (int k = 0; k < result.GetLength(2); k++)
{
Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,
j, k]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
这种调用方式是以引用传参的方式调用的,三个输入参数的类型分别是 int,
MWArray[], MWArray[].第一个参数表示输出参数的个数,第二个参数是引用参数,用来保存输出值的,最后一个参数传入待处理的数据。注意到后两个参数是
MWArray 类型的数据,是否可以将多个待求和的数组一次性传入最后得到一个
同维的 MWArray 类型的结果数组呢?我试了一下,发现这样做行不通,代码示
例如下,有兴趣的朋友可以自己试一下:
//输入三维数组,调用第一个重载函数
double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },
{ 10, 11, 12 } } };
MWArray[] argin = new MWNumericArray[2];
argin[0] = new MWNumericArray (data);
double[,] data2 = new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10,
11, 12 } };
argin[1] = new MWNumericArray(data2);
MWArray[] argout = new MWNumericArray[2];
SumClass mySum = new SumClass();
mySum.Sum(2, ref argout,argin);
double[, ,] result = (double[, ,])argout[0].ToArray();
for (int i = 0; i < result.GetLength(0); i++)
for (int j = 0; j < result.GetLength(1); j++)
for (int k = 0; k < result.GetLength(2); k++)
{
Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,
j, k]);
}
double[,] result2 = (double[,])argout[1].ToArray();
for (int i = 0; i < result2.GetLength(0); i++)
for (int j = 0; j < result2.GetLength(1); j++)
{
Console.WriteLine("result2[{0},{1}] = {3}", i, j, result2[i, j]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
这段代码调了很久都没调成功,试着把 argin[0]和 argin[1]改成同结构的数组,行
不通;试着把 Sum 函数的第一个参数改成 1,也行不通。都是在调用 Sum 函数
的时候出现”Too many input parameters”的错误。不知道增加这个输出参数个数到
底是什么意思,放在这里有什么用。暂且放在这吧。
2)调用第二个函数
第二个重载函数原型: public MathWorks.MATLAB.NET.Arrays.MWArray[] Sum(int
numArgsOut
,
MathWorks.MATLAB.NET.Arrays.MWArray x)
这一个重载函数其实是第一个和第四个的综合。将输出参数放在了外面,同时又
在输入参数中加了一个输出参数个数 numArgsOut。测试代码和第一个重载函数
的测试代码类似:
//输入三维数组,调用第二个重载函数
double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },
{ 10, 11, 12 } } };
MWNumericArray argin = new MWNumericArray(data);
MWArray[] argout = new MWNumericArray[1];
SumClass mySum = new SumClass();
argout = mySum.Sum(1, argin);
double[, ,] result = (double[, ,])argout[0].ToArray();
for (int i = 0; i < result.GetLength(0); i++)
for (int j = 0; j < result.GetLength(1); j++)
for (int k = 0; k < result.GetLength(2); k++)
{
Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,
j, k]);
}
Console.WriteLine("Press enter to finish");
Console.ReadLine();
第三个重载函数和第五个重载函数一样,无解,不知道从哪里输入数据。
3 其他注意事项
有关 MWNumericArray 数据类型以及其他由 MWArray 派生的其他数据类型
向.NET 平台数据类型的转换大家还可以去查看这些类提供的一些方法。比如说
MWNumericArray 的 ToVector 方法还可以将 Matlab 中的矩阵转成.NET 中的一维
数组,NumberofDimensions 获得维度数,NumberofElements 获得元素个数等等。
总结
关于 Matlab 与.NET 数据类型转换,首先要求我们对两边的数据类型都有清
楚的了解。MWArray 及其派生类可以代表 Matlab 中各种各样的数据类型,比如
说一个 MWNumericArray 类型的变量可以表示一个数值(1×1)、一个一维数组
(1×n)、一个多维数组(m×n 或 m×n×p……等)。这样向.NET 中的数据类型
转换时最保险的方法就是在.NET 平台上定义一个和 MWArray 类所包含的潜在数
据类型结构相同的变量。这样转换一般才不会出问题。 在 Matlab 把 M 文件编译成.NET 中可调用的组件之后,最好再将这些组件
在.NET 平台上再封装一层,将中间类型的参数全部变成.NET 的数据类型参数,
以供不熟悉 Matlab 与.NET 数据交换的.NET 程序员使用。
在这么多重载函数中,最好使用和 M 文件中定义的函数形式相同的那个函
数(我习惯把它叫做标准函数),其他重载函数尽量少用或不用,以免没搞清楚
这些函数的输入输出造成函数调用失败或得到错误结果。