C# Matlab 混合编程学习

C# Matlab 混合编程实验

工程中有些测试需要对数据进行处理,并输出图表计算。而Matlab在数据处理和图形输出上有优势,相比而言C#等编程实现图表较困难。
Matlab中已经提供封装成库供其它语言调用的功能。由于Matlab内变量定义类型与其它语言不一致,Matlab提供了相关参数的转换类和函数。供C#转换的基类的MWArray,继承的有MWNumericArray、MWCellArray等,包含在MWArray.dll中。

实现过程

1.Matlab中创建供C#调用的类,添加函数,并生成dll;
2.创建使用的C#工程;
3.复制需要使用的Matlab库和生成的库至C#工程执行目录,并引用Matlab新生成的Dll;
4.C#工程中调用Matlab的Dll。

具体实现举例

本示例实现C#调用Matlab中的库,实现弹出提示信息。
Matlab版本:R2012a 64位
VS版本:2010

1.Matlab中创建供C#调用的类,添加函数,并生成dll

如下图,打开Matlab,File–New–Deployment Project…。
C# Matlab 混合编程学习_第1张图片

弹出创建工程窗体,本例定义工程名称为“MCTForNet.prj”,Type选择“.Net Assembly”,如下图:
C# Matlab 混合编程学习_第2张图片

之后,Matlab界面会新增“.Net Assembly”的项目页,如下图:
C# Matlab 混合编程学习_第3张图片
点击“Add Class”创建类,本例重命名类为“MCTForNetMain”;点击“Add files”,添加需要调用的Matlab函数文件。本例中”ShowFigTest.m”简单实现读取传入的文件名数组,并弹出文件数组个数。代码如下:

function ShowFigTest( rawFiles )
fileCount=length(rawFiles);
msgbox(num2str(fileCount), '关于', 'help'); 
End

点击“Build”按键,生成dll,目录为:…\MCTForNet\MCTForNet\distrib\

2.创建使用的C#工程

VS下,创建项目“MatLabTest1”,项目类型为”Windows Forms Application”。
由于Matlab生成的dll为x64,故项目平台需要设置为x64位。

3.复制需要使用的Matlab库和生成的库至C#工程执行目录,并引用Matlab新生成的Dll

复制C#中需要使用的Matlab库MWArray.dll至C#工程执行目录下。
路径在Matlab安装目录下:…\MATLAB\R2012a\toolbox\dotnetbuilder\bin\win64\v2.0\

复制在步骤1中生成的dll至C#工程执行目录下。
C# Matlab 混合编程学习_第4张图片

4.C#工程中调用Matlab的Dll

C#工程中,引用MWArray.dll和生成的MCTForNet.dll;
C# Matlab 混合编程学习_第5张图片

添加调用函数。本例用涉及把字符串数组作为参数传递给Matlab函数,使用MWCellArray类,见函数SArrayToMWCellArray:

public void ShowFig()
{
    string[] files = System.IO.Directory.GetFiles(@"D:\DownLoad\");
    MWCellArray mwA = SArrayToMWCellArray(files);

    MCTForNetMain mctForNetM = new MCTForNetMain();
    mctForNetM.ShowFigTest(mwA);
}
private MWCellArray SArrayToMWCellArray(string[] sArray)
{
    MWCellArray mwA = new MWCellArray(1, sArray.Length);
    for (int i = 0; i < sArray.Length; i++)
    {
        mwA[1, i + 1] = sArray[i];
    }

    return mwA;
}

数值数组赋值举例:

MWNumericArray mwRange = new int[] {1, 16, 169, 192};

调用ShowFig()函数,生成弹出窗体:
C# Matlab 混合编程学习_第6张图片
Matlab的类调用较耗时。

你可能感兴趣的:(C# Matlab 混合编程学习)