matlab c# c与matlab混合编程程问题

sponsored links
matlab C++ 混合编程出现的问题
错误使用 cd
无法将目录改变为 ./datasets/VOCdevkit2007 (Name is nonexistent or not a
directory)。
出错 get_voc_opts (line 4)
出错 imdb_from_voc (line 41)
VOCopts = get_voc_opts(root_dir);
出错 Script_spp_voc&perpare_train_data (line 89)
opts.imdb_train
imdb_from_voc(opts.devkit,
'trainval', '2007', flip) };
出错 Script_spp_voc (line 46)
= perpare_train_data(opts, opts.flip |
opts.flip_finetune);
&想不到是opencv没安装的问题。。。我也是在安装其他的项目的时候发现的
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新
Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部 ...
利用Matcom实现基于MATLAB的混合编程 来源: 神经网络 作者:AI俱乐部 网友评论 0 条 浏览次数 42 Matcom是mathTools公司推出的最早的Matlab到C++的编译器.后来,由于Mathtools被Matlab公司收购,Mtacom对Matlab 5.3以后的版本就没有推出新的版本.相比Matlab自带的编译器Compiler,用 ...
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码)在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了matlab内置函数在混合编程中的优点,并通过程序找出了matlab中的大部分内置函数,当然更多人关心是如何像我所说得那样,不用直接编译,就直接在C#中调用这些内置函数 ...
原文:[原创]Matlab.NET混合编程调用Figure窗体1.前言 做Matlab.NET混合编程好几年了,虽然Matlab很多函数忘记得差不多了,但基本的东西还是能熟练使用.特别是在C#调用Matlab函数这方面,积累了比较多的经验,和使用经验密切相关.根据很多朋友经常遇到的WinForm窗体混编调用Matlab的Figure的问题,花了一些功夫,把这 ...
原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MW ...
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新
Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab ...当前位置: >>
Matlab与C#混合编程
本文所使用的环境是 VS2010+Matlab2011b,此方法不适合 Matlab2010 及以下的版本。本文 图比较多,但是按照此步骤走下去,一定可以成功的生成一个可调用的 dll 文件。红字部分 为特别注意的地方。 示例代码可以在 CSDN 中搜索用户 bqrmt,在资源列表中查找。 生成 C#的接口 在 C#中新建一个类库,如下图所示,工程名最好易识别,本文使用 DemoTestInterface修改平台配置,如果使用的项目是 x86 的,就生成 x86,否则就 x64。一定不能 AnyCPU。并 且 x86 的平台只能使用 x86 的 Matlab 来生成,x64 的必须使用 x64 的 Matlab 生成。如果系 统是 Win7x64 的,Matlab 一般是 x64 的,如果需要生成 x86,可以使用 VMWare 虚拟机 添加引用, MWArray.dll ,路径为: ..\MATLAB\toolbox\dotnetbuilder\bin\win32\v2.0\ ,由于 VS2010 并不支持.Net 中直接添加,所以需要在浏览选项卡中添加,如下图所示。如果使用的是 VS2008,可以直接在.Net 选项卡中找到,MathWorks, .NET MWArray API。在此 选项卡中,按键盘上的“M” ,出现的第一个,就是所要的文件。VS2010 中目前未能实现通 过此方法添加。也可以与 VS2010 一样,在浏览中添加。添加之后,如下图所示 在类文件的头部,添加 using,内容如下:using MathWorks.MATLAB.NET.A,并修改类类 型为 Interface 和相应的接口名。并注意接口名与命名空间名不能一样。如下图所示:添加所需要实现的 Matlab 函数声明,本例中实现的是两个矩阵的乘法,添加声明,其中 MWNumericArray 是 Matlab 与 C#的变量转换中间类,在文章第 11 页有具体细节的解释。此 处,只需要给出主函数的声明,子函数不需要声明。如下图所示: MWNumericArray MatrixMultiply (MWNumericArray srcMat1, MWNumericArray srcMat2);生成此接口文件,待调用。 Matlab 相关操作 编写需要实现的主函数,函数名需要与 C#声明的函数名相同。如果需要使用到子函数,一 并编写子函数,此处使用子函数,将矩阵乘以 1。由于本文只是一个示例,所以具体的变量 保护的措施,建议最好在 C#调用 Matlab 之前就做好,结合本例,如两个矩阵不一样大小等 等。注意主函数中的“double” ,如果希望主 C#调用的结果是 double 型的,此处需要强制转 换成 double 型,其它类型则以希望输出的变量类型设置。文章第 11 页有详细讲解。新建一个 Matlab 工程,可以由 File-&New-&Deployment Project 创建,或者直接在 Command Window 中输入 deploytool 创建,如下图: 修改工程名,适合自己习惯,这里使用 MatlabMultiply.prj 修改 Type,为.Net Assembly,此步骤非常重要。出现界面如下图所示: 选择 Add class,根据自己习惯,以方便识别为原则,添加 Matlab 的类名,这里使用 CS,一 并将主函数拖动到此处。如果需要使用到子函数,将子函数拖动到 Shared Resources 中。如 下图所示:选择界面右上方的齿轮,在弹出的下拉菜单中选择 Settings,进行相关配置 在弹出的界面中,需要设置两个地方,一个是.Net 设置,另一个是 Type Safe API,在.Net 设 置中,Microsoft Framework 默认选择是 default,将此处按照目标环境修改,如 VS2008 就选 择 3.5,VS2010 选择 4.0。这里选择 4.0在 Type Safe API 设置中,需要将上一步骤生成的接口文件复制到当前 Matlab 函数的文件夹 中,并在 Interface assembly 中选中。如下图所示: 选择右上角齿轮旁边的生成按钮,生成需要的 dll 文件。生成的文件中一般需要用到的有如下三个文件, CSIDemoTest.dll 、 MatlabMultiplyNative.dll 和 DemoTestInterface.dll。特别的是,第二个文件,在 distrib 文件夹中,有一个名字类似, 但是不带 Native 的文件,此文件不需要。第三个文件,是此前 C#生成的接口文件。将此三 个文件复制到需要调用的工程中,并添加引用。下一节会给出具体调用方法。 调用 Matlab 生成的 dll 新建一个工程,这里使用最简单的控制台程序将上一节提到的三个 dll 文件复制到该工程的文件夹下,并添加引用。文件位置也可以是在 别处,无特别的要求,仅仅是为了方便。同样也添加 MWArray.dll,方法见文章开始处。 在代码中添加 using,一共有四个,如下图所示: using MathWorks.MATLAB.NET.A using MathWorks.MATLAB.NET.U using MatlabM using MatlabMultiplyN以 Matlab 三个文件中的第一个文件 CSIDemoTest.dll 的文件名 CSIDemoTest 为类名,实例化 一个类。然后编程:运行并得到结果如下: 关于中间类的说明: 数据类型到 M 类型: 如果 C++/C#数据不是数组,直接将值传递给已经初始化的 MWArray 数组中的成员。 直接 将数据类型赋值给已经初始化的 MWNumericArray 变量。 直接将字符串类赋值给已经初始 化的 MWCharArray 变量。 如果是数组类型,直接赋值给 MWNumericArray 变量;赋值给 MWArray 变量,则在前面加 上类型转换如: (MWNumericArray)进行强制转换。 总之,MWArray 是总类型,其它的以 MW 开头,以 Array 结尾的变量类型都可以直接对它进行赋值或取值。 M 类型到 C++/C#数据类型 MWArray M 类型,它是 M 文件的编译后内部的标准类型,一切 C++/C#类型都要最终转换成 此类型,方可作为参数调用 M 语言函数。 MWCharArray M 的字符串类型, 使用它可以将 M 中的字符类型转换成 C++/C#的字符串类型。 MWNumericArray 是 MWArray 与 C#等语言的转换中间类型。 常用的转换函数: 1、public Array ToArray(MWArrayComponent component); 将 M 类型转换成 C#的 Array 类型,然后可以直接转换成其它类型的数组。 2、public byte ToScalarByte(); 将 M 类型转换成 C#的字节类型; 3、public double ToScalarDouble(); 将 M 类型转换成 C#的双精度类型; double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble(); 4、public float ToScalarFloat(); 将 M 类型转换成 C#的单精度类型; 5、public int ToScalarInteger(); 将 M 类型转换成 C#的整型类型; 6、public long ToScalarLong(); 将 M 类型转换成 C#的长整 C/C++/C#数据型类型; 7、public short ToScalarShort(); 将 M 类型转换成 C#的短整型类型; 8、public override string ToString(); 将 M 类型转换成 C#的字符串类型; string arror = mwArgout[2].ToString(); 9、public Array ToVector(MWArrayComponent component); 将 M 类型转换成 C#的 Array 类型,然后可以直接转换成其它类型的数组。 下面使用调试过的代码示例表述 1 和 9 两个函数的区别: 1、double[,] Temp1 = new double[1,3]; Temp1= (double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real); 9、double[] s1 = new double[2]; s1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real); 从以上代码可以看出:函数 1 得到了二维数组,而 9 则是得到了一维数组。转换成 C++/C# 数据类型后,它们的维数均为从 0 开始。
Matlab与C#混合编程的实现_IT/计算机_专业资料。混合编程Matlab 与 C#混合编程的实现 混合编程的实现 c#之间一些数据类型的转换的方法 我也曾经写过。 之间一些数据...关于matlab与c#混合编程的问题_计算机软件及应用_IT/计算机_专业资料。matlab与c#混合编程的 关于matlab 与 c#混合编程的问题
00:45shulai1008 | 浏览...Matlab 与 C#混合编程的实现 关于 matlab 与 c#之间一些数据类型的转换的方法,我也曾经写过。总结一下, 最主要的是要完成下面几个步骤: 1、 同时安装.net...简析MATLAB和.NET混合编程_计算机软件及应用_IT/计算机_专业资料。这个是我写的...例如 C#、 VB.NET、 J#、 C++.NET、 F#等语言, 甚至是网络程序也可以调用...Visual C#与Matlab混合编程在可视化软件中的应用_人文社科_专业资料。Visual C#与Matlab混合编程在可视化软件中的应用今日推荐 160份文档
四季养生 中医养生与保健 ...1.3.3 心得等 最近在搞 matlab 与 c#混合编程,发现了一些问题,说出来大家讨论一下: (1) matlab 中的乘幂运算是非常好用的,但变成 com 组件后被 C#调用 ...MATLAB 亦可以与其他高级语言 C/ C++/ C#/Java/Fortran 等进行混合编程。 1.2 什么是 Matlab 引擎所谓 Matlab 引擎(engine),是指一组 Matlab 提供的接口函数,...VS2008-C#与Matlab2011b... 暂无评价 6页 免费 在VS2008中使用Qt编程 2页 ...VS2008 与 MATLAB2010b 混合编程 环境目录设置: 环境目录设置:第一步: 通过...vs2010 和 Matlab R2012b 混合编程
22:40 10114 人阅读 评论(4) 收藏 举报 分类: C++(2) 版权声明:本文为博主原创文章,未经博主允许不得转载...MATLAB2010b 混合编程程序中使用 MATLAB 编译产生的 DLL (VC6.0, MATLAB R2010...至于和 matlab 的混编,区 别应该不是很大,不过,使用 C#的话,可能更适合使用 ...
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力。在此以一个小例子的形式给大家讲述一下二者混合编程的实现。
一、软件的配置说明
C#版本:VS2010;MatLab版本:MatLab2011a
二、制作matLab的C# dll文件
2.1首先写一个M文件(实现你想要的函数执行形式)
以网上down了一个M文件(实现基本的绘图功能),内容见下表,
function test(h,D)
for x=-10:0.1:10,
elseif x&-D
y=h/(D*x);
&2.2 创建制作的dll文件的工程
在MatLab的命令窗口中,输入deploytool,或者利用菜单选项,file-new-deployment project打开创建dll文件的工程创建窗口,如下图所示。
在图中,主要分为以下三部分,Name:你想要命名的名字,prj是工程的后缀(一般不忽略);location:创建工程的储存位置;type:针对c#而言,我们需要选择.net assembly这一项;点击Ok选项,工程已经创建完毕。下一步就是向工程中加入你想要的方法等元素。
2.3 向所建工程中添加对应的元素
上述过程中,就相当于在C#中创建了Untitled2的命名空间,需要在此添加对应的类和方法。基于上述的例子,下一步,我们在窗体菜单中& destop-.netAssembly-点击选择,见下图所示。
在上面Classes是你自己对应编写了一个类,然后向里面添加Add files,也就是你之前编写的M文件,经过编译之后,就在对应的工程文件中,形成你所需要的dll文件。下一步我们如何在C#中利用对应的dll文件。
三、如何在C#中利用Matlab制作的dll文件
3.1首先,将matlab中对应的刚编写好的untitled的dll文件,同时从C:\Programs\Files\MatLab\R2011a\toolbox\dotnetbuilder\bin\win64\v2.0中拷贝出MWArrary.dll和ManagedCPPAPI.netModule三个文件拷贝到C#编写的工程文件中去,C#编程文件的debug文件中。在这里特别说明的一点是:最后一个文件在matlab2011a中没有找到对应的文件,发现并不影响程序的执行。
3.2在C#的工程中,我们在引用中----添加对彼此dll文件的引用。见下图
3.3命名空间的引用 using.....的书写
using MathWorks.MATLAB.NET.Ausing MathWorks.MATLAB.NET.Uusing Untitled1;
四、最后,在C#中如何引用这些matlab提供的计算模块的功能实现
&4.1 在C#中调用MatLab的函数是最重要的是函数变量之间的传递是如何实现的?
包括以下几个问题:a、将C#的参数带入到matLab的函数的参数中,将C#的参数转化成对应的MWArray类型。
&&&&&&&&&&&&&&&&&&&&&&&&& b、如何将Matlab函数返回的类型,转化成C#对应的函数类型。
&4.2 MWNumericArray是MWArray和c#中数据的中间类,实现C#与matlab间传递参数的功能
a.double型、int型等数值类型的变量传递
MWNumericArray i = null, result =
myClass myclass = new myClass(); //实例化
result = (MWNumericArray)myclass.myfunc(i);
b.字符串(需要用到MWCharArray和MWArray转换)
MWCharArray FileName = myS
MWNumericA
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=
myclass.picture(x);
testz.testzclass st = new testz.testzclass();
MWArray[] max = st.testz(2);
MWNumericArray x1 = (MWNumericArray)max[0];
MWNumericArray x2 = (MWNumericArray)max[1];
double[,] location1 = (double[,])x1.ToArray(MWArrayComponent.Real);
double[,] location2 = (double[,])x2.ToArray(MWArrayComponent.Real);
label1.Text = location1[1,2].ToString();
其中的M文件:
function [x1,x2]=testz()
x1=[1 2 3;
x2=[9 8 7;
常用的转换函数:&&&&&&
① public Array ToArray(MWArrayComponent component);
将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。
② public byte ToScalarByte();
将M类型转换成C#的字节类型;
③ public double ToScalarDouble();
将M类型转换成C#的双精度类型;
double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();
④ public float ToScalarFloat();
将M类型转换成C#的单精度类型;
⑤ public int ToScalarInteger();
将M类型转换成C#的整型类型;
⑥ public long ToScalarLong();
将M类型转换成C#的长整C/C++/C#数据型类型;
⑦ public short ToScalarShort();
将M类型转换成C#的短整型类型;
⑧  public override string ToString();
将M类型转换成C#的字符串类型;string arror = mwArgout[2].ToString();
⑨  public Array ToVector(MWArrayComponent component);
将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。
下面使用调试过的代码示例表述①⑨两个函数的区别:
double[,] Temp1 = new double[1,3];&&&&&&&&&&&
Temp1= (double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);
double[] s1 = new double[2];&&&&&&&&&&&&&&&&
s1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);
从以上代码可以看出:函数①得到了二维数组,而⑨则是得到了一维数组。转换成C++/C#数据类型后,它们的维数均为从0开始。
&最后总结:
C++/C#数据类型到M类型
此方向转换十分简单。
如果C++/C#数据不是数组,
直接将值传递给已经初始化的MWArray数组中的成员
直接将数据类型赋值给已经初始化的MWNumericArray变量。
直接将字符串类赋值给已经初始化的MWCharArray变量。&
&&&& 如果是数组类型:
直接赋值给MWNumericArray变量;
赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。
总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。
M类型到C++/C#数据类型
M类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。
MWCharArray
M的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。
MWNumericArray
MWNumericArray是MWArray与C#等语言的转换中间类型。
&上述整理参考了文献出自
在实现过程中遇到的问题:
错误信息:&未能加载文件或程序集&MWArray, Version=2.11.1.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f&或它的某一个依赖项。试图加载格式不正确的程序。&
解决方案:将C#项目属性从x86-&x64就行了
补充一个例子的应用:
function [x1,x2]=test(x3)
x1=[1 x3*x3 x3;
x2=[9 8 7;
&在C#中形成的几种函数形式如下:
&&&&&&& public MWArray test();&&&&&&& public MWArray[] test(int numArgsOut);&&&&&&& public MWArray test(MWArray x3);&&&&&&& public MWArray[] test(int numArgsOut, MWArray x3);&&&&&&& public void test(int numArgsOut, ref MWArray[] argsOut, MWArray[] argsIn);
所以在C#中可以选择不同的形式调用,其中numArgsOut指的是输出参数的个数 &argsOut:输出参数,当然尽管C#中泛泛提出了几种函数形式,确只有第3,4,5是可以使用的(结合自己写的M文件内容)
脱离matlab安装的环境下,如何实现程序的运行自如:&
通过com组建的形式进行混合编程,如果机器上没有安装MATLAB,编译生成的软件照样可以使用,但是需要安装MATLAB提供的MATLAB Compiler Runtime,这个软件在MATLAB的安装目录下:X:\MATLAB\R2010a\toolbox\compiler\deploy\win32 \MCRInstaller.exe(X是MATLAB安装的盘符),如果你的电脑上安装了MATLAB,则不需要在重新安装这个软件。另外,不同的& MATLAB版本提供的MATLAB Compiler Runtime可能会不同,如果在另一台电脑上自己编写的软件运行有问题,可能是编译器的版本不同引起的
阅读(...) 评论()matlab和c#混合编程有没有懂的,指导一下,不胜感激_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
matlab和c#混合编程有没有懂的,指导一下,不胜感激
我有更好的答案
具体什么问题啊,你描述一下啊,或者加Q
我打算用C#做个处理好看点的界面,和一些控件,但是里面的算法用matlab写,因为matlab函数比较全,数据处理是用matlab写,界面用C#写,最好是在C#程序里面,直接可以引用matlab函数,我的QQ号是,谢谢
如果你需要调用的matlab函数比较多的话,可能需要编译的dll也就多,而且程序第一次启动的时候较慢,加Q详说
采纳率:82%
为您推荐:
其他类似问题
混合编程的相关知识
换一换
回答问题,赢新手礼包}

我要回帖

更多关于 c与matlab混合编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信