最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上。

  网上此类的文章较多,但自己在实现过程中还是有些差别,所以在项目进行之前,自己写了一个测试的例子来实现C#对Matlab函数的调用

一.  测试用例简介

  功能:Matlab函数计算两个数值a与b的和,a与b的值由C#提供,和值c经Matlab计算得出后,返回给C#

  环境:Microsoft Visual Studio 2008

     Matlab R2009a(Version 7.8.0.347)

  备注:由官网可知,Matlab对类似其他程序调用都提供了很好的支持,这里没有选择VS版本大于Matlab版本,是因为担心Matlab版本只支持自己之前的VS版本。

二.  实现步骤

  1. 实现Matlab函数

    A. 打开Matlab R2009a,新建testAdd.m文件

    B. testAdd.m中实现加法函数

 function y = testAdd(a, b)
y = a + b;

  2. 编译testAdd.m,得到DLL文件,以便由C#引用

    A. 在Matlab命令行中输入"deploytool",即可弹出"Deployment Tool"工具窗口

      在网上看很多资料,执行"deploytool"命令之前都需要安装Matlab编译器(命令:"mbuild -setup"),但我不这样做,也可编译。怀疑是否与我将VS,Matlab都装在一台机器有关。另外即便我执行这安装命令,也找不到正确的编译器。总之,我并没有按照网上教程,直接"deploytool"即可。这也提醒自己:实践过后,才知是否正确,不要盲目听从别人方法。

    B. 编译DLL,需要在"Deployment Tool"工具窗口中新建Deployment project

      这里我建了名为"test"的工程,选择project类型时,应选择.NET Component,因为这里我需要其作为C#的引用。同时注意这里的工程名,即是你编译出DLL的名称,同时C#程序调用时,"Test"即为封装Matlab函数的类名。他将你的工程名,首字母大写用为高级语言中的类名。

    C. 配置"test" project

      首先将testAdd.m添加到test工程下Test文件夹中(右击Test,选择Add File)(注意:这里不要使用中文路径,详见下方六.测试过程中Bug记录)。

      其次选择Setting,在设置中,配置.NET Microsoft Framework,由"Default"改为"2.0",不能用默认。网上说法是否则编译出的DLL会有问题。

      注意:这里网上许多资料讲,要将Assembly Type设置为Shared,但我发现如果这样,必须要提供Encryption Key的文件路径,这个就没法提供了。所以我并没有这样做,事实上没有影响。疑惑的地方。

    D. 点击"Build"编译文件(如下图所示)

      

     即可在test\src路径下得到编译后的DLL文件

     

  3. 实现C#程序,调用Matlab编译出的DLL

    A. C#项目中,导入Matlab DLL引用

      导入的文件:test.dll, testNative.dll, MWArray.dll(%matlabpath%\toolbox\dotnetbuilder\bin\win32\v2.0,MWArray是用于C#与Matlab之间的数据交换类,传值,取结果都用到它)

    B. 实现C#调用代码

 using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using test; namespace testMatlab
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); label6.Text = "";
} private void button1_Click(object sender, EventArgs e)
{
//Get input number from UI
int iTextBox1 = int.Parse(textBox1.Text.ToString());
int iTextBox2 = int.Parse(textBox2.Text.ToString()); MWArray result = null;
MWNumericArray a = new MWNumericArray(iTextBox1);
MWNumericArray b = new MWNumericArray(iTextBox2); //call function testAdd, provided by Matlab
Test t = new Test();
result = t.testAdd((MWArray)a, (MWArray)b); int y = ((MWNumericArray)result).ToScalarInteger(); //show result in UI textBox3.Text = y + "";
label6.Text = "Get the result by Matlab DLL, Answer: " + y;
}
}
}

三.  执行C# winform程序,验证计算结果,确定是否执行了Matlab函数调用

    1. 输入初值

   

    2. 得到结果

   

   

四.  小结

  由此,可实现C#对Matlab算法的调用。当然这里只是自己开发需要时,设计的一个小例子。由于Matlab计算,输入与结果需要大量的矩阵,那C#与其之间的数据交换也是通过MWArray进行,只要遵循接口规范,都可以实现。这里不再研究,网上资料也很多。

  

五.  完整的测试例子附件

  Matlab函数:http://files.cnblogs.com/KevinSong/testMatlab.zip

  C#程序:http://files.cnblogs.com/KevinSong/Test.zip

.  测试过程中Bug记录

  1. 调用DLL时,程序报错"MathWorks.MATLAB.NET.Utility.MWMCR.mclCreateComponentData,错误描述是:传递给系统调用的数据区域太小"

    解决方法:不能使用中文路径的.m文件,可能会有诡异的问题产生

    参考链接:http://hi.baidu.com/ssemo/item/4caab7f3a0765ec20dd1c888

虽然网上参考资料很多,但经过自己实践,还是发现一些不同的小地方。项目进行前,通过一个小的测试例子来证明技术路线可行。希望对需要的同学有帮助。抛砖引玉:-)

Best Regards

Kevin Song

  

【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)的更多相关文章

  1. 【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)

    最近在写一个C#的项目,用户需求是实现Winform的多文档界面与Matlab算法程序之间的交互.做了一段时间发现,这既能利用业余时间,实战中也可学习一些技术,同时刚毕业也增加一份收入.所以后面会不断 ...

  2. 在maven项目中 配置代理对象远程调用crm

    1 在maven项目中配置代理对象远程调用crm 1.1 在项目的pom.xml中引入CXF的依赖 <dependency> <groupId>org.apache.cxf&l ...

  3. VISUAL STUDIO 2008 WINDOWS FORM项目发布生成安装包详解(转)

    转自:http://www.cnblogs.com/killerofyang/archive/2012/05/31/2529193.html Visual Studio 2008 Windows Fo ...

  4. Visual Studio 2008中FormatX源代码格式化插件

    原地址:http://www.cr173.com/html/15492_1.html 我总是对组里的兄弟代码规范性近乎完美的要求,举个简单的例子: 1.  每个方法必须有注释,方法参数详细说明 2.  ...

  5. Visual Studio 2008中添加运行按钮 转载

    在Visual Studio 2008中添加运行按钮 默认情况下,VS2008中的工具栏上没有运行按钮,只有调试(Debug)按钮,可按照以下方法添加 1.点击菜单Tools(工具)->Cust ...

  6. C++项目中采用CLR的方式调用C#编写的dll

    1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的“dll”文件复制到C++项目中的Debug目录下3.将C++项目属性设置 ...

  7. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

  8. 在WINDOWS中安装使用GSL(MinGW64+Sublime Text3 & Visual Studio)

    本文介绍在Windows下安装使用GSL库,涉及GSL两个版本(官方最新版及GSL1.8 VC版).msys shell.GCC.G++等内容,最终实现对GSL安装及示例基于MinGW64在Subli ...

  9. 在WINDOWS中安装使用SIGPACK(MinGW64+Sublime Text3 &Visual Studio)

    本文介绍在Windows下安装使用SigPack库,涉及Armadillo.OpenBLAS安装使用说明,最终实现对SigPack示例CPP基于MinGW64在Sublime Text3下的编译运行, ...

随机推荐

  1. jdk 1.6.0_39 下载

    Java SE Development Kit 6u39 Product / File Description File Size Download password Linux x86 65.42 ...

  2. 在生产环境下禁用swagger

    学习目标 快速学会使用注解关闭Swagger2,避免接口重复暴露. 使用教程 禁用方法1:使用注解@Profile({"dev","test"}) 表示在开发或 ...

  3. 项目笔记《DeepLung:Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification》(三)(上)结果评估

    在(一)中,我将肺结节检测项目总结为三阶段,这里我要讲讲这个项目的第三阶段,至于第二阶段,由于数据增强部分的代码我始终看不大懂,先不讲. 结果评估的程序在evaluationScript文件夹下,这个 ...

  4. JS执行顺序-函数声明提升、匿名函数、函数表达式

    大方向上: JS 是按照 代码块 进行 编译.执行 的. 学习至: 1.变量声明提升 2.新唐的博客 3.js中匿名函数的创建与调用方法分析 4.前端圣经 - <高程三> 5.深入理解变量 ...

  5. getResourceAsStream properties

    try (InputStream is = getClass().getResourceAsStream("/test.properties")) { Properties pro ...

  6. DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配

    DRF接入Oauth2.0认证[微博登录]报错21322重定向地址不匹配 主题自带了微博登陆接口,很简单的去新浪微博开放平台创建了网页应用,然后把APP ID和 AppSecret填好后,以为大功告成 ...

  7. robotFramework 读取Excel文件

    1.Robotframework读取Excel文件 第一步:先安装ExcelLibrary 可以直接通过命令安装:pip install robotframework-ExcelLibrary 安装完 ...

  8. 移动测试之appium+python 入门代码(三)

    在做app自动化过程中会踩很多坑,咱们都是用中文的app,所以首先要解决中文输入的问题!本篇通过屏蔽软键盘,绕过手机的软键盘方法,解决中文输入问题. 一.定位搜索 1.打开淘宝点击搜索按钮,进入搜索页 ...

  9. va_list arg_list va_start(arg_list, format) va_end( arg_list ) 原理的理解

    void log( int log_level, const char* file_name, int line_num, const char* format, ... ) { .......... ...

  10. 如何成为一名:黑客/Programmer/Python高手

    如何成为一名黑客 Eric Steven Raymond https://translations.readthedocs.org/en/latest/hacker_howto.html How To ...