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

本文详细介绍了如何在C#与MATLAB之间进行数据转换与运算,包括常用数据类型的映射规则、数据类型转换方法及注意事项。通过具体案例展示了如何在C#中调用MATLAB函数并处理返回的数组数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: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 TypeMWArray TypeMATLAB Type
System.DoubleMWNumericArraydouble
System.FloatMWNumericArraysingle
System.ByteMWNumericArrayint8
System.ShortMWNumericArrayint16
System.Int32MWNumericArrayint32
System.Int64MWNumericArrayInt64
System.CharMWCharArrayChar
System.StringMWCharArrayChar
System.BooleanMWLogicalArraylogical

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

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

如果C#是数组到M类型:
直接赋值给MWNumericArray变量;    
赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。 
MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值
注意这里可能会出现的问题:
在这里插入图片描述
解决方法是是将项目的属性中的平台目标你自己电脑的位数(我是改成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文件夹下

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值