Matlab 数据类型与.NET 数据类型转换 程序员
by-GalaxyGap 2012-12-11算法
用 Matlab 写算法仍是有不少优点的,具体表如今如下几个方面:1)Matlab数组
的内部函数是用 C 语言写的,虽然 M 语言是解释性语言,但调用内部函数进行浏览器
计算仍是很快的。2)通常咱们写算法都会涉及到不少基本的数学操做,好比说矩函数
阵相乘、矩阵求逆、求特征值、知足特定分布的随机数生成、基本统计量的计算测试
等等。这些基本的数学操做能够说是咱们算法的基本组成部分,咱们可使用任ui
何一种语言编写函数一一实现这些基本的数学操做,而后由这些最基本的数学操spa
做构建咱们更复杂的算法。可是咱们有没有必要这么作呢?显然没有!由于这些设计
基本的数学操做虽然原理咱们都懂,本身亲自动手实现也不会太难,但它太耗时,调试
咱们本身写出来的东西可能也不稳健!耗时这个很好理解了,即便是一个很简单
的矩阵求逆咱们也要写一大段的代码,费劲心思去进行流程设计和步骤分解,编
写代码的时候也要当心翼翼地处理各类细节。能够说从最底层开始写算法是很是
费神的,等你算法写好了,估计也已经累得半死,而后项目也早过时了。更严重
的是本身写出来的基本模块没有一些数学软件提供的模块那么稳健,可能存在某
些漏洞或 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 文件中定义的函数形式相同的那个函
数(我习惯把它叫作标准函数),其余重载函数尽可能少用或不用,以避免没搞清楚
这些函数的输入输出形成函数调用失败或获得错误结果。