使用MWNumericArray和MWArray类型实现c#与matlab的混合编程,以及解决C#接收matlab输出2个参数的问题

一:MATLAB与C#间的运算转换

若要在c#中生成矩阵值到MATLAB中运算并返回c#,必然不能缺少中间类,MWArray类型是Matlab中的数据类型,MWNumericArray类型是Matlab和C#的中间类型。我们在C#中一般转换为MWNumericArray类型,这个类型可以隐式的转换至MWArray格式,也转换至int,double,float格式。

1. C#数据类型到M类型,此方向转换十分简单。
一切C#都要转换成MWArray类型才能作为参数调用MATLAB语言函数。
下表列出了常用的将.NET数据类型转换为MATLAB类型的数据类型映射规则,来源点击查看:

.NET Type MWArray Type MATLAB Type
System.Double MWNumericArray double
System.Float MWNumericArray single
System.Byte MWNumericArray int8
System.Short MWNumericArray int16
System.Int32 MWNumericArray int32
System.Int64 MWNumericArray Int64
System.Char MWCharArray Char
System.String MWCharArray Char
System.Boolean MWLogicalArray logical

如果C#不是数组到M类型:

  • 直接将值传递给已经初始化的MWArray数组中的成员
  • 直接将数据类型赋值给已经初始化的MWNumericArray变量。
  • 直接将字符串类赋值给已经初始化的MWCharArray变量。

如果C#是数组到M类型:
直接赋值给MWNumericArray变量;    
赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。 
MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值
注意这里可能会出现的问题:
使用MWNumericArray和MWArray类型实现c#与matlab的混合编程,以及解决C#接收matlab输出2个参数的问题_第1张图片
解决方法是是将项目的属性中的平台目标你自己电脑的位数(我是改成x64).

MWNumericArray vsg = new int[] { 1, 2, 3 };

2.M类型到C#数据类型
先将输出参数强制转化为MWNumericArray类型,再调用各种转化函数。

  • public Array ToArray(MWArrayComponent component)M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

  • public Array ToVector(MWArrayComponent component)将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

  • public byte ToScalarByte() ; 将M类型转换成c#的字节类型

  • public double ToScalarDouble(); 将M类型转换成c#的双精度类型

  • public float ToScalarFloat(); 将M类型转换成c#的单精度类型

  • public override string ToString();将M类型转换为字符串类型

double[,] Temp1 = new double[1,3];
Temp1 = (double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);
double[] S1 = new double[2];
S1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
string arror = mwArgout[2].ToString()

思考:调用MATLAB中的函数如果输出2个数组,C#该如何解决?参考案例如下:

            MWArray[] agrsOut = new MWArray[2];//两个输出参数,一定要写数量
            airPLS_Class airplas = new airPLS_Class();//这个airPLS_Class是我自己的,大家的肯定不一样
            agrsOut= airplas.airPLS(2, x_input, lambda, order, wep, p, itermax);//输入2表示有两个输出矩阵,根据原先m文件的定义
            MWNumericArray real_spectrumMW = agrsOut[0] as MWNumericArray;

            MWNumericArray base_line_arrayMW = agrsOut[1] as MWNumericArray;

            Array c = real_spectrumMW.ToArray();
            double[,] real_spectrum = (double[,])c;
            //你也可以直接写成double[,] real_spectrum = (double[,])real_spectrumMW.ToArray();
            Array d = base_line_arrayMW.ToArray();
            double[,] base_line_array = (double[,])d;

二:在调用MATLAB时要注意的事项

  1. 要在最前面写上:
    using MathWorks.MATLAB.NET.Arrays;//经常使用
    using MathWorks.MATLAB.NET.Utility;//经常使用
    using fitcurve;//建立的函数
    using FWHM;//建立的函数

2.将matlab文件夹下的函数文件 fitcurve.dll,FWHM.dll(这些是你在MATLAB中的函数)和D:\Program Files\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0(前边为matlab的安装路径)文件夹下的MWArray.dll拷贝到VS工程(CallMatlabDllApp)下的\bin\Debug文件夹下

使用MWNumericArray和MWArray类型实现c#与matlab的混合编程,以及解决C#接收matlab输出2个参数的问题_第2张图片
MATLAB的打包
c#要使用fitcurve.dll和Fwhm.dll文件,要先经过matlab打包
1.建立一个fitcurve.m函数,在命令行输入 deploytool
使用MWNumericArray和MWArray类型实现c#与matlab的混合编程,以及解决C#接收matlab输出2个参数的问题_第3张图片
选择第三个Library Compiler .
使用MWNumericArray和MWArray类型实现c#与matlab的混合编程,以及解决C#接收matlab输出2个参数的问题_第4张图片
最后点击Package 打包完成后选择fitcure.dll文件
matlab函数转成c#
MWNumericArray Constructor
从C#向Matlab的数据类型转化
BitConverter

你可能感兴趣的:(c#与matlab的混合编程)