c#与matlab之间传输,⼿把⼿教你C#与MATLAB混合编程
(上)
客户已经在MATLAB中编辑好了算法,现在想利⽤C#强⼤的图形界⾯功能进⾏显⽰,同时做成安装包进⾏发布应该如何操作?MATLAB中有⼤量的算法⼯具,⽐如说DSP等算法⼯具,是否可以将该⼯具包进⾏封装成类进⾏调⽤,这样就不需要每次⼤量混合编程⼯作了?
MATLAB,C#,混合编程,DSP
软件版本:MATLAB 2013a(64bits),Visual Studio 2015(bits),.NET 4.0
第⼀步:编写M函数,并测试可以使⽤
做⼀个简单的MATLAB算法的封装,只先将MATLAB的FFT进⾏封装。⾸先在MATLAB中创建⼀个.m的⽂件,源码如下,如图1所⽰:
functionY = FFT(X,N)
y=fft(X,N);%对信号进⾏快速Fourier变换
Y=abs(y);%取Fourier变换的振幅
图1
注意,混编必须是m函数function的形式才能被调⽤。上述函数简单测试⼀下,没有问题(复杂的函数⼀定要多测试,否则后续调试⾮常困难)。继续下⼀步。
第⼆步:在Matlab中使⽤deploytool建⽴混编项⽬
在Matlab⼯作区输⼊命令:deploytool,然后得到下⾯界⾯,输⼊混编项⽬的名称,选择存储位置,关键的是类型那⾥⼀定要选择".NET Assembly"。如下图2所⽰:
图2
选择“OK”之后,下⼀步MATLAB界⾯右侧会出现项⽬解决⽅案,需要添加类名称和M⽂件。这个类名称,就是编译完成之后C#项⽬中的类对象名称,然后添加我们刚才上⼀步编写的“FFT.m”,然后编译即可,如下图3所⽰:
图3
到此为⽌,⼀个常规 简单的Matlab.NET混编已经完成了60%了。编译完成之后,打开“Package”选项卡,即可看到⽣成的dll⽂件,然后点击右键,打开⽂件夹即可,如下图所⽰:
图4
第三步:C#中添加matlab的dll引⽤
打开VS2015创建⼀个窗体的应⽤程序,主要需要完成的是DLL的引⽤添加,将matlab⼯程(matPrj)src⽂件夹下的FFTDemo.dll
和D:\ProgramFiles\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0(前边为matlab的安装路径)⽂件夹下的MWArray.dll 添加到项⽬引⽤中去,如图5所⽰。其中MWArray主要的作⽤是做将MATLAB与C#中的数据进⾏转换交接。主要的原因是,MATLAB本⾝来说是⼀种⽐较松散的语⾔,在整个算法编程过程中并没有定义出来类似于C#中的多种数据类型,如double,float或者int等数据类型,所以在混个编程数据交接过程中需要有⼀个dll进⾏数据类型的转换的。
图5
同时需要添加以下的命名空间在系统中:
//⽤户⾃⾏添加的命名空间
usingFFTDemo;//这是我们⾃⼰定义的
usingMathWorks.MATLAB.NET.Arrays;//在MWArray.dll中,最常⽤的
usingMathWorks.MATLAB.NET.Utility;//在MWArray.dll中,最常⽤的
在使⽤过程总,我们可以这样理解,我们之前编译好的dll就是⼀个类,我们⾸先需要将这个类进⾏实
例化,然后每⼀个我们编写好的.m⽂件都是⼀个⽅法。所以⾸先要做的就是将类进⾏实例化,整体的代码如下所⽰,利⽤SeeSharp所⽣成波形,利⽤MATLAB中的dll算法继续FFT分析同时进⾏显⽰,其中单机Button2时候的部分就是混合编程调⽤FFT的部分:
namespace FFTMATLABdemo
{
public partial class Form1:Form
{
publicForm1()
{
InitializeComponent();
}
FFTdemofft =new FFTdemo();
Stopwatchsw =new Stopwatch();
Stopwatchsw1 =new Stopwatch();
private double[] wave =new double[100000];
private double[] nosie =new double[100000];
private voidbutton1_Click(objectsender,EventArgse)
{
label3.Text = (trackBar1.Value * 100).ToString() +"Hz";
Generation.SineWave(refwave, 5, 0, trackBar1.Value * 100, 10000);
Generation.UniformWhiteNoise(refnosie);
ArrayCalculation.Add(wave, nosie,refwave);
easyChart1.Plot(wave);
}
private voidbutton2_Click(objectsender,EventArgse)
{
button2.Enabled =false;
MWNumericArrayMatlabWave = wave;
MWArrayx = 10000;
sw.Start();
vark = fft.FFT(MatlabWave, x);
sw.Stop();vs编程软件
easyChart2.Plot((double[,])k.ToArray());
label1.Text = sw.ElapsedMilliseconds.ToString();
sw.Reset();
button2.Enabled =true;
}
}
}
测试结果,如图所⽰,混合编程的结果与MATLAB中的测试结果⼀定是⼀致的,⽽且整体来说做100K个点FFT变换效率也不错,⼤概在0~1ms左右的范围内。
图6
混合编程虽然可以脱离MATLAB环境,但是必须安装MATLAB运⾏时—MCR,并且开发版本和运⾏版本的MCR要对应,否则会出错误,我们将在程序中进⾏说明。其中MCR安装是不需要版权的。
本来说做混合编程并不是⼀个⽐较复杂的事情,唯⼀的难点其实是在C#与MATLAB中数据转化的内容,其实这⼀部分在MATLAB⾃带的帮助⽂档是有写的。所以我们只需按照帮助⽂档的提⽰去操作就可以了。
混合编程过程中,有很多的问题都可以通过通⽤的搜索引擎中搜索答案,同时如果⽤MATLAB所⽣成的3D图形可以在C#中调⽤并且显⽰。
在相关链接中有⼀套⾮常好的C#与MATLAB混编的教学视频,⾮常推荐