我是靠谱客的博主 欣慰星月,最近开发中收集的这篇文章主要介绍CSharp调用Matlab编译的dll,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


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

WMArray.dll所在的全路径为:C:ProgramFilesMATLABR2010btoolboxdotnetbuilderbinwin64v2.0,可知WMArray为64位的dll。所以新建的CSharp工程对应的目标平台应为64.

二、操作步骤

1、matlab中安装MCRInstaller。其所在目录:C:Program FilesMATLABR2010btoolboxcompilerdeploywin64。

双击,按提示安装即可。

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 FilesMATLABR2010bbin。若打开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 FilesMATLABR2010btoolboxdotnetbuilderbinwin64v2.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自带参考案例:D:Program FilesMATLABR2010btoolboxdotnetbuilderExamplesVS8NET

最后

以上就是欣慰星月为你收集整理的CSharp调用Matlab编译的dll的全部内容,希望文章能够帮你解决CSharp调用Matlab编译的dll所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部