c#与matlab的混合编程

  • MATLAB与C#间的运算转换
    若要在c#中生成矩阵值到MATLAB中运算并返回c#,必然不能缺少中间类,我们可以通过MWNumericArray强制转换到需要的类型,而这个中间类型可以转换至MWArray格式,也转换至int,double,float格式。

    fitcurve.Class1 polyfit = new fitcurve.Class1();//对象实例化 fitcurv是matlab的函数名

  • C++/C#数据类型到M类型,此方向转换十分简单。

    如果C++/C#数据不是数组:
    1.直接将值传递给已经初始化的MWArray数组中的成员    
    2.直接将数据类型赋值给已经初始化的MWNumericArray变量。    
    3.直接将字符串类赋值给已经初始化的MWCharArray变量。

如果是数组类型:
1.直接赋值给MWNumericArray变量;    
2.赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。 
MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值

  • M类型到C++/C#数据类型
    1.MWArray
    M类型,一切C++/C#都要转换成此类型才能作为参数调用MATLAB语言函数.
    2.MWCharArray
    M的字符串类型,使用它可以将M中的字符串类型转换成C++/C#的字符串类型。
    3.MWNumericArray
    MWNumericArray是MWArray与C#等语言的转换中间类型。
    *public Array ToArray(MWArrayComponent component) /*M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。 /
    public Array ToVector(MWArrayComponent component)/将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。/
    区别:
    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);
    *public byte ToScalarByte() ; / * 将M类型转换成c#的字节类型 /
    *public double ToScalarDouble(); /*将M类型转换成c#的双精度类型 /
    例;
    double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
    *public float ToScalarFloat(); /*将M类型转换成c#的单精度类型 /
    public override string ToString();/将M类型转换为字符串类型 string arror = mwArgout[2].ToString()/
    public void Button_nihe_Click()
        {
                int outNum = 1;//定义matlab输出参数的个数
                **fitcurve.Class1 polyfit = new fitcurve.Class1();//对象实例化  fitcurv是matlab的函数名**
                **MathWorks.MATLAB.NET.Arrays.MWArray[] result = new MWArray[] { 0, 0, 0, 0, 0, 0 };//定义存放matlab函数运行结果的一个数组,就是A0-A5//输出参数**
                //定义matlab参数  一个1行9列矩阵
                double[] xData_temp = new double[11];
                double[] yData_temp = new double[11];//例如253.65表示紫外线的波长
                double[] xData_temp1 = new double[10];
                double[] yData_temp1 = new double[10];//例如253.65表示紫外线的波长
                double[] xData_temp2 = new double[10];
                double[] yData_temp2 = new double[10];//例如253.65表示紫外线的波长
                if (Zhiwai_flag)
                {
                    xData_temp[0] = peakValuex[0];// peakValuex[0];//59;
                    xData_temp[1] = peakValuex[1];// peakValuex[1];//127; 
                    xData_temp[2] = peakValuex[2]; //peakValuex[2];//188;
                    xData_temp[3] = peakValuex[3];// peakValuex[3];//234;
                    xData_temp[4] = peakValuex[4];// peakValuex[4];//271;
                    xData_temp[5] = peakValuex[5];// peakValuex[5];//256; 
                    xData_temp[6] = peakValuex[6];// peakValuex[6];//403;
                    xData_temp[7] = peakValuex[7];// peakValuex[7];//443; 
                    xData_temp[8] = peakValuex[8];
                    xData_temp[9] = peakValuex[9];
                    xData_temp[10] = peakValuex[10];

                    
                    yData_temp[0] =253.65;
                    yData_temp[1] =296.728;
                    yData_temp[2] =313.155;
                    yData_temp[3] =365;
                    yData_temp[4] =404.656;
                    yData_temp[5] = 407.78;
                    yData_temp[6] = 435.833;
                    yData_temp[7] = 507.3;
                    yData_temp[8] = 546.07;
                    yData_temp[9] = 576.96;
                    yData_temp[10] = 579.066;

                    **MWNumericArray xData = xData_temp;**//创建一个可以供matlab调用的数组
                    **MWNumericArray yData = yData_temp;**//创建一个可以供matlab调用的数组
                     //调用matlab函数
                     result = polyfit.fitcurve(outNum, xData, yData);//注意result数组中第一个数是系数最高的那个数组在本例中就是A5
                     // MWNumericArray out_Arr = (MWNumericArray)result[0];
                     // float[] s1 = new float[6];
                     //aaCoefficient = (float[])((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real); //转换成C#数据类型后,它们的维数均为从0开始
                     aaCoefficient = (double[])((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real);
                     tem_data1 = BitConverter.GetBytes(aaCoefficient[0]);//A5
                     tem_data2 = BitConverter.GetBytes(aaCoefficient[1]);//A4
                     tem_data3 = BitConverter.GetBytes(aaCoefficient[2]);//A3
                     tem_data4 = BitConverter.GetBytes(aaCoefficient[3]);//A2
                     tem_data5 = BitConverter.GetBytes(aaCoefficient[4]);//A1
                     tem_data6 = BitConverter.GetBytes(aaCoefficient[5]);//A0
                }

                if (KeJ_flag)
                {
                    xData_temp[0] = 59;// peakValuex[0];//59;
                    xData_temp[1] = 127;// peakValuex[1];//127; 
                    xData_temp[2] = 188; //peakValuex[2];//188;
                    xData_temp[3] = 234;// peakValuex[3];//234;
                    xData_temp[4] = 271;// peakValuex[4];//271;
                    xData_temp[5] = 256;// peakValuex[5];//256; 
                    xData_temp[6] = 403;// peakValuex[6];//403;
                    xData_temp[7] = 443;// peakValuex[7];//443;  
                    xData_temp[8] = 501;
                    xData_temp[9] = 600;
                    yData_temp1[0] = 404.656;
                    yData_temp1[1] = 407.783;
                    yData_temp1[2] = 435.833;
                    yData_temp1[3] = 507.304;
                    yData_temp1[4] = 546.074;
                    yData_temp1[5] = 576.96;
                    yData_temp1[6] = 593.456;
                    yData_temp1[7] = 626.31;
                    yData_temp1[8] = 738.398;
                    yData_temp1[9] = 763.511;
                 
                    MWNumericArray xData = xData_temp1;
                    MWNumericArray yData = yData_temp1;
                    //调用matlab函数
                    result = polyfit.fitcurve(outNum, xData, yData);//注意result数组中第一个数是系数最高的那个数组在本例中就是A5
                    // MWNumericArray out_Arr = (MWNumericArray)result[0];
                    // float[] s1 = new float[6];
                    //aaCoefficient = (float[])((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real); //转换成C#数据类型后,它们的维数均为从0开始
                    aaCoefficient = (double[])((MWNumericArray)result[0]).ToVector(MWArrayComponent.Real);
                     tem_data1 = BitConverter.GetBytes(aaCoefficient[0]);//A5
                    tem_data2 = BitConverter.GetBytes(aaCoefficient[1]);//A4
                    tem_data3 = BitConverter.GetBytes(aaCoefficient[2]);//A3
                    tem_data4 = BitConverter.GetBytes(aaCoefficient[3]);//A2
                    tem_data5 = BitConverter.GetBytes(aaCoefficient[4]);//A1
                    tem_data6 = BitConverter.GetBytes(aaCoefficient[5]);//A0
                }
            }

GetBytes(Double) 以字节数组的形式返回指定的双精度浮点数。返回的是长度为8的字节数组
BitConverter Class 是将基础数据类型与字节数组相互转换的类,GetBytes(Double) 是它的方法。

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

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

在这里插入图片描述
MATLAB的打包
c#要使用fitcurve.dll和Fwhm.dll文件,要先经过matlab打包
1.建立一个fitcurve.m函数,在命令行输入 deploytool
在这里插入图片描述
选择第三个Library Compiler .
在这里插入图片描述
最后点击Package 打包完成后选择fitcure.dll文件
matlab函数转成c#
MWNumericArray Constructor
从C#向Matlab的数据类型转化

猜你喜欢

转载自blog.csdn.net/weixin_42974146/article/details/83243272
今日推荐