许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  C#调用Matlab编译生成的DLL文件教程

C#调用Matlab编译生成的DLL文件教程

阅读数 9
点赞 0
article_banner



   一、使用环境:Visual Studio 2010,Matlab7.11.0(R2010b),操作系统为64位,则对应的Matlab安装在Program Files文件夹下,而非Program Files(*86)。

WMArray.dll所在的全路径为:C:\ProgramFiles\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0,可知WMArray为64位的dll。所以新建的CSharp工程对应的目标平台应为64.

二、操作步骤

1、matlab中安装MCRInstaller。其所在目录:C:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win64。

双击,按提示安装即可。

2、安装Matlab编译器:在Matlab命令行输入mbuild -setup,设置编译器,在设置过程中会出现选择编译器的提示,我的电脑是装的VS2010:

 

3、运行deploytool,编译.net dll

在Matlab命令行中输入deploytool,出现如下窗口:

Name:表示将要生成的 dll文件  名,本实例为LJF

Location:生成文件的位置,选择默认。

Target:因为是要用CSharp去调用Matlab的dll,所以选择.Net Assembly

注:我的Matlab装在了C盘目录下,默认工作路径为C:\Program Files\MATLAB\R2010b\bin。若打开Matlab时未用管理员的身份打开,则在该工作目录下建Deployment Project工程时会提示Save Failed错误:

解决办法:1、以管理的身份启动Matlab。2、更改Location的目录

单击Deployment Project对话框的OK按钮后,会出现以下窗口:

编译前先要设置以下,在上图中点击Settings:

设置.NET。选择Microsoft Framework时一定要选当前使用版本。不能选default,要不然编译出来的会有点问题。

此处选择了3.5

(在64位的Windows 7下,用VS2010编译4.0以前的.Net项目会有问题。原因是一个叫Resgen.exe的玩意儿,是跑在64位环境下的,当他试图加载32位的可执行代码时,就会执行失败)

本测试实验新建的C#程序是.Net framework4.0

Add Class 添加LJF_Class类

Add files 添加 PolynominalFit.m文件:

如下内容:

function mm = PolynominalFit( m,n,x,j )
%功能:对输入n,及输出m,坐j次多项式拟合,
% 然后在拟合曲线上,找到x对应的值
nh=polyfit(n,m,j);    %拟合曲线
mm=uint8(polyval(nh,x));%多项式求值
end

点击编译:

编译时出现如下界面:会在我们指定的目录下面生成LJF工程,在LJF文件夹下包含两个子文件夹distrib,src。distrib文件夹包含我们要用的dll文件,src文件夹包含编译的源文件。

三、打开VS2010,新建一个C# 窗体应用程序,记得选择.Net Framework3.5

    1、  导入matlab dll

MWArray的路径如下:C:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0

  2、在C#中输入以下代码:

   

using MathWorks.MATLAB.NET.Utility;using MathWorks.MATLAB.NET.Arrays;using LJF;


 3、先学习一些基本常识

matlab中的数据与c#中数据的传递

   我们先了解一下 MWNumericArray,它是 MWArray与 C#中数据传递的中间类。

   MWNumericArray是 MWArray和 c#中数据的中间类,怎么用?怎样在 C#与 matlab间传递参数?

   a.double型、 int型等数值类型的变量传递

MWNumericArray i = null, result = mydouble;

   i=4;

   myClass myclass = new myClass(); //实例化

   result = (MWNumericArray)myclass.myfunc(i);



   b.字符串 (需要用到 MWCharArray和 MWArray转换)

   MWCharArray FileName = myString;

   MWNumericArray sensitivity;

   sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);

   c.多个输出参数组成的数组

   MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组

   (matlab返回的数组下界是从 1开始的)

   取出数组中的一个元素值

mydouble=out_Arr[i].ToScalarDouble();

如上面例子 ToScalarDouble一类的 toXXXX等方法还有许多。

d.result.toArray可以把 matlab返回的矩阵变成 C#的 n x m数组, eg:

double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);

e.将数组传入 Matlab(和传递单个数值的方法一样 )

   double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };

   MWNumericArray x=dbx;

   myclass.picture(x);

4、测试VS程序

代码如下:

using System;using System.Collections.Generic;using System.ComponentModel;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 LJF; namespace CSharpInvokeMatlabDll{    public partial class Form1 : Form    {        public Array mm;        public Form1()        {            InitializeComponent();            int[] x = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 255 };            int[] y = { 34, 35, 36, 37, 38, 40, 43, 45, 48, 52, 58, 66, 74, 83, 92, 105, 115, 129, 149, 168, 185, 198, 212, 220, 223, 224, 224 };//27            int[] p = new int[255];            for (int i = 0; i < 255;i++ )            {                p[i] = i;            }            int n = 6;             invgamma_Class mygam = new invgamma_Class();            MWArray ResultOut = null;            ResultOut = mygam.invgamma((MWNumericArray)x, (MWNumericArray)y, (MWNumericArray)p, (MWNumericArray)n);            MWNumericArray temp = (MWNumericArray)ResultOut;             mm = temp.ToArray(MWArrayComponent.Real);        }         private void button1_Click(object sender, EventArgs e)        {            int qq = Convert.ToInt16(textBox1.Text);            if (qq<255&&qq>=0)            {                int pp = Convert.ToInt16(mm.GetValue(0, qq));                textBox2.Text = pp.ToString();            }            else            {                MessageBox.Show("data error");            }        }    }}


注意要将CSharp工程的目标平台设置为64位。

 

资源下载地址:http://download.csdn.net/detail/ivanljf/6504173


Matlab自带参考案例:https://www.gofarlic.com\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\Examples\VS8\NET


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空