一、使用环境: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自带参考案例:D:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\Examples\VS8\NET