利用C 图形界面展示MATLAB算法的高效混合编程实践
利用C#的图形界面功能展示在MATLAB中开发的算法并进一步制作安装包进行分发。考虑到MATLAB中包含众多算法工具例如DSP等客户询问是否可能将这些工具包封装为类从而简化混合编程的工作量当前软件版本为MATLAB 2013a64位、Visual Studio 201532位以及.NET 4.0。► 混合编程步骤首先要用MATLAB创建封装算法的m文件这里以FFT为例。源码如下matlabfunction Y FFT(X,N)y fft(X,N); % 对信号执行快速Fourier变换Y abs(y); % 获取Fourier变换结果的振幅请注意上述代码仅为示例实际封装时可能需要根据具体需求进行适当调整。02在MATLAB中使用deploytool创建混合编程项目在MATLAB命令窗口中输入“deploytool”命令将打开deploytool界面。在此界面中输入您的混合编程项目的名称并选择适当的存储位置。关键的是在类型选择中务必指定为“.NET Assembly”。选择“OK”后MATLAB界面右侧将呈现项目解决方案其中包含添加类名称和M文件的选项。所选择的类名称将在编译完成后成为C#项目中的类对象名称。将我们之前编写的“FFT.m”文件添加进去并开始编译。至此我们已完成MATLAB与.NET混合编程的60%。编译完成后进入“Package”选项卡会看到已生成的dll文件。右键点击dll文件选择“Open Folder”即可查看该文件所在位置。► C#中的dll引用接下来我们需要在C#环境中引入MATLAB生成的dll文件。打开Visual Studio 2015创建一个窗体应用程序并确保将matlab工程(matPrj)src文件夹下的FFTDemo.dll以及MATLAB安装路径D:\ProgramFiles\MATLAB\R2013a\toolbox\dotnetbuilder\bin\win64\v2.0下的MWArray.dll添加到项目引用中。► 引用dll和命名空间在C#中需引用MATLAB生成的dll文件和MWArray.dll。同时我们需要在系统中添加以下命名空间csharpusing FFTDemo; // 这是我们自己定义的命名空间对应于FFTDemo.dllusing MathWorks.MATLAB.NET.Arrays; // 这是MWArray.dll中常用的命名空间using MathWorks.MATLAB.NET.Utility; // 同样在MWArray.dll中提供实用功能► C#示例代码在C#中使用MATLAB生成的dll时我们可以将dll视为一个类并通过实例化该类来使用其中的方法。通过实例化FFTdemo类编写按钮事件处理程序用以调用FFT算法。以下是一个示例代码片段展示了如何在C#中利用SeeSharp生成的波形数据通过MATLAB的dll算法进行FFT分析并显示结果。当单击Button2时会触发混合编程调用FFT的部分。csharpnamespace FFTMATLABdemo{public partial class Form1 : Form{public Form1(){InitializeComponent();FFTdemo fft new FFTdemo();Stopwatch sw new Stopwatch();Stopwatch sw1 new Stopwatch();}private void button2\_Click(object sender, EventArgs e){button2.Enabled false;MWNumericArray MatlabWave wave;MWArray x 10000;sw.Start();var k fft.FFT(MatlabWave, x);sw.Stop();easyChart2.Plot((double[,])k.ToArray());label1.Text sw.ElapsedMilliseconds.ToString();sw.Reset();button2.Enabled true;}03测试结果与效率经过测试我们发现混合编程的结果与MATLAB中的测试结果完全一致。同时对于100K个点的FFT变换其效率也相当可观变换时间大约在0~1ms的范围内。