-
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时要注意的事项
- 要在最前面写上:
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的数据类型转化