您的位置:首页 > 编程语言 > MATLAB

在C#应用中使用Matlab函数

2016-01-06 23:14 302 查看
在C#应用中使用Matlab函数,其实质是使用
.net
组件进行混合编程,即将
.m
文件生成
.dll
文件,在C#项目中通过添加引用进行调用。所以可以分为以下三个步骤:

编写matlab函数形成
.m
文件

通过
.m
文件构建
.dll
文件

创建C#项目并在其中添加上一步生成的
.dll
引用

本次测试的环境为
Windows 8.1(x64)
+
Visual Studio Ultimate 2013
+
MATLAB R2015b


编写matlab函数

鉴于测试目的,就以一个简单的函数为例,在此称之为
myplus.m
,如下:

function [s] = myplus(a, b)
% Calculate the sum of a and b
s = a + b;


由m文件构建dll文件

在这一步我们需要先做些环境配置,即配置matlab的编译器,这可通过在matlab的
command window
中输入以下两个命令来实现:

mbuild -setup


mex -setup


此次测试中matlab的编译器均被配置为
Microsoft Visual C++ 2013 Professional


接下来在
command window
中输入
deploytool
,会弹出Compiler界面,如下图所示:



选择红框所示的第三项
Library Compiler
,再弹出一个界面,如下所示:



如图所示,这个界面的标题为MATLAB Compiler - Untitled1.prj,顶部为COMPILER部分,由六个模块组成,分别为
FILE
TYPE
EXPORTED FUNCTIONS
PACKAGING OPTIONS
SETTINGS
PACKAGE
。其实,这个界面即为MATLAB项目构建界面,为了完成构建dll,我们需要按以下几个步骤来做:

TYPE
界面中选择目标类型为
.NET Assemby


EXPORTED FUNCTIONS
界面中添加函数,本次测试中添加的函数为
myplus.m
。添加完函数后,
Library information
界面中的Library Name自动改变为第一个添加的函数名,本次测试中库名改变为myplus,当然,你可以更改库名为你想要的名称,同时也可以对
Library information
界面中的其他部分进行修改。

设置Namespace,若不做任何修改,namespace缺省为与库名称一样。同时在这一块已有一个自动添加的类,名称为Class1,你可以修改这个类名,为这个类添加方法,这些方法来自EXPORTED FUNCTIONS(导出的函数)。当然,你也可以再添加一些类并为他们添加方法。

对运行时做一些设置,主要是选择
Microsoft framework
,本次试验中选择4.0(MATLAB当前支持的最高版本)。

最后,点击
PACKAGE
界面中的Package,稍等片刻就会生成对应的dll。

最后生成的dll文件位于与库名称一样的文件夹中,这个文件夹又包含了三个文件夹和一个打包日志文件,本次实验中的层次结构如下所示:





在C#项目中引用dll调用matlab函数

创建一个C#控制台应用,将.Net设置为4.0,platform target设置为x64,将上一步生成的文件夹for_redistribution_files_only的不带Native的dll拷贝到Debug目录下,同时要将MWArray.dll文件

拷贝到Debug目录下。MWArray.dll文件位于
%matlabroot%\\toolbox\dotnetbuilder\bin\win64\v2.0
。为我们的控制台项目添加这两个dll引用,撰写如下C#代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using HelloDotNetMatlab;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Class1 myhello = new Class1();
MWArray i = 4;
MWArray j = 3;
MWArray result;
result = myhello.myplus(i, j);
Console.WriteLine(result.ToString());
Console.ReadKey();
}
}
}


至此,我们的任务完成,我们会看到在控制台成功输出了
7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: