在c++中调用MATLAB函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c++中调用MATLAB函数相关的知识,希望对你有一定的参考价值。

我只会写很基本的vc++ win32控制台程序,用visual studio 2010,MATLAB r2011a .想在c++中调用MATLAB中的函数.按照网上说的试了很久,不知道为什么不行,程序就在 http://zhidao.baidu.com/question/284196563.html这个网址里.我怀疑是不是我项目属性什么设置有问题,谁同样用visual studio 2010,MATLAB r2011a(或者版本差不多的也行)能不能写一段可以执行的代码.因为我在晚上看的方法版本都挺老的,不知道和现在差多少.程序只要可以实现从c++中调用MATLAB函数,不需要实现什么复杂的功能,我只需要看到程序的格式和visual studio 2010中的设置就好了,不要去网上抄吧,我其实也逛了很久才来这里提问的.谢谢!

1、安装MatLab6.5主要是为了得到MatLab数学库的头文件.dll文件和.lib文件,当然可以从其它电脑上把包含这些文件的文件夹拷过来用,具体是哪些文件夹,后面会说到。

2、建好了.dll(Dynamic-Link Library的简称)项目之后,首先要做就是进行包含目录设置:“工具”—>“先项”—>“目录”—>“目录[S]”在这个下接框中选“Include files”项进行头文件库设置,在下面的文本框中输入要需要的头文件的所在的文件夹目录(这样设置之后,在需要的时候,编译器就会这些目录下在查找头文件),这里应该输入是D:\MatLab6dot5\extern\include\cpp和D:\MatLab6dot5\extern\include。当然,我把MatLab6.5装到了D盘的MatLab6dot5目录下了。所以,从这里就可以看出,我们所需的头文件就存在这两个文件夹中,那么如果没有装MatLab的话,就拷贝这两个文件夹就行了(对.h/.hpp文件来说)。然后再选中“目录[S]”下接框中的"Library files"进行.lib文件库设置,其方法和“Include files”的设置道理是一样的,这里应该输入的文件夹是D:\MatLab6dot5\extern\lib\win32\microsoft\msvc60和D:\MatLab6dot5\extern\lib\win32。
3、需要说明的是,第3步的设置是属于编译器的,也就是说,第3步的设置只需要设一次VC6.0就会铭记于心了。而在这一步要进行的设置是工程设置,这个设置是针对具体的工程的,所以,每一个要调用MatLab数学库的函数都要进行这一设置:“工程”—>“设置”把开“Project Settings”对话框,然后在对话框中的
1)"c/c++"—>"分类"下拉框中选“预处理器”在“预处理器定义”文本框中增加MSVC,IBMPC,MSWIND这三个指令。
2)"c/c++"—>"分类"下拉框中选“Code Generation”,在“Use run time library”下拉框中选中“Multithreaded DLL”。
3)“连接”—>“对像/库模块”文件框中增加libmatpm.lib libmmfile.lib libmatlb.lib libmat.lib libmx.lib 这个静态库。

说明一下这段代码:首先,#include "matlab.hpp"是必不可少的,要不然编设器真不知道我是调用MatLab中的函数。其次,在MatLab的世界里,所有的数(组)都是矩阵,哪怕只是做一个简单的1+1=2,其实都是矩阵们之间的交易。c++数学库函数的调用方式和MatLab里的调用方式非常相似,当然进行交易的也都是一些矩阵,这里的mwArray类(注意,这是一类),就是一个矩阵,在C库里面就是mxArray结构体,mwArray类其实是有一个指向一个mxArray结构体的指针,关于这个就不多说了。其实关于这个看是很简单的函数,如果细细的去读它,会发现一些小问题(这里的问题不是说这个函数有错),这些问题是须要弄明白的。
5、要使这个dll知道它其有被“别人”调用的功能,就必须要声明哪些函数(当然这个例子中只有一个函数,但实际上,可能不只一个)是要导出的。关于这个有两种方式,我在这里采用的是一种通过性较好的方式——运用.def文件。所以,在这个工程中增加一个文体文件,并把它命名为“dll_1.def”,这里的.def护展名需要手动的键入。并在dll_1.def中输入以下的代码:
LIBRARY dll_1
EXPORTS

6、编译工程,生成dll。“组建”—>“组建[dll_1.dll]”。于是,会发现在工程所在的文件目录下就的bin/Debug文件夹中就生成了一个dll_1.dll文件了,这就是我们想要的东西了。
7、在C#中调用dll_1.dll中的函数(具体来说,是调用LU这个函数)。打开VS2008,新建一个C#窗口工程吧。啊,刚刚把vc6.0关掉,现在又打开VS2008,真是倍感亲切和畅快,因为在C#里面,好像一切都不那么拘束了,很随便。在C#里,没有单独的函数了,所有都是对像,函数就只能存在于对像之内了,像调入的C++DLL中的函数,一般都只能是对像的静态成员函数。于是,在工程中增加一个类,随便取个名字吧,叫cppDllInvokeDemo,具体的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; //注意加入这个命名空间
namespace CshapWinInvokeCppDll

class cppDllInvokeDemo

const string dll_1 = "dll_1.dll";
[DllImport(dll_1, CallingConvention = CallingConvention.Cdecl)]
public static extern int LU(int n, double[] A,double[] B,double[] X);

参考技术A 方法1 mcc 生成cpp文件方式

1、设置项目编译选项

首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:

Project-> Settings-> C/C++

Category:Preprocessor

Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND

Category: Precompiled Headers

选择: Automatic use of precompiled headers
Through header: stdafx.h

2、调设置项目连接选项

首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib)

libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def
参考技术B 我不能告诉你详细方法,要说的是matlab有专门的COM组件跟c++结合,网上很难用文字说清楚。
我以前做过一个程序,是用C++生成了Matlab代码保存为文本,然后再用程序更改扩展名,调用MatLab打开,只能做到截取图片。。。
本回答被提问者采纳
参考技术C 最近没空,所以简单的说一下。在C或者C++执行Matlab的函数需要调用Matlab引擎,Mathworks提供了详细的帮助,你在Matlab帮助文件里搜索engOpen函数,最下面有个例子,叫engwindemo.c,是教你如何在C中使用Matlab引擎。

要执行Matlab函数需要调用engEvalString函数,他可以把一个字符串放到Matlab里面去执行,如果这个字符串是个函数名称,且Matlab可以找得到这个函数的话就会执行他。

整个过程不是几分钟弄得明白的,因为你要用C和Matlab互操作必须要熟悉mxArray这个类型的使用,所有Matlab的数据都是以mxArray来保存的,因此你执行函数返回的内容也会是mxArray。

不过,Matlab帮助文件都很详细地说了使用方法。追问

嗯,新上手,总觉得帮助文件不好看懂.估计这个要一段时间钻研才能搞懂.最近想要搞懂这个是做课程设计作业的时候想到这个的.谢谢你!加了你好友,也许以后还可以问到你.

C++调用matlab数学函数问题

下面是书上说的实现方法:

Visual C++中使用MATLAB语言C,C++数学函数库

MATLAB开发环境的C,C++数学函数库以mwArray结构体为数据核心,使用mcc命令将M文件转换成的C/C++文件可以直接在Viusal C++开发环境中使用,但是编译后的C,C++文件一般程序冗长,代码可读性较差。在熟练掌握C, C++数学函数库的基础上,读者可以使用mwArray结构体自行编写基于应用程序接口(API)函数库C, C++数学库的C/C++文件,可以极大优化程序代码,减少程序代码存储空间,提高程序代码的执行效率和执行速度。在下文的讲述中,将通过一个简单实例来演示如何利用mcc命令创建独立与MATLAB平台运行的exe文件。

首先使用MATLAB的M语言建立用户所需要的特定功能M 文件,在这里,为了简单而言,建立一个实现魔方阵功能的M文件magicCreat.m。

function y = magicCreat(n)
y = magic(n)

然后从%matlabroot%\ extern\examples\compiler (%matlabroot%为读者计算机系统中MATLAB的安装路径,本文中为

C:\Program Files\MATLAB\R2006a\extern\examples\compiler)

路径下拷贝main_for_lib.c和main_for_lib.h.到当前的工作路径下,以便mcc编译命令调用。然后创建调用magicCreat.m文件的C语言程序如下:

#include "stdio.h"
#include "math.h"
#include "libPkg.h" //编译建立的库头文件
main( int argc, char **argv )

mxArray *N; /* 输入变量矩阵指针 */
mxArray *R = NULL; /* 结果矩阵指针 */
int n; //默认的M文件输入变量数值
/* 获取命令行参数,如果命令行输入小于2,则输入参数默认为5 */
if (argc >= 2)
n = atoi(argv[1]);
else
n = 5;

//初始化MCR和libPkg函数库
mclInitializeApplication(NULL,0);
libPkgInitialize();
/* 得到输入参量的数值 */
N = mxCreateDoubleScalar(n);
/*调用magicCreat.m编译后的文件mlfMagicCreat*/
mlfMagicCreat(1, &R, N);
/* 释放内存空间*/
mxDestroyArray(N);
mxDestroyArray(R);
//结束libPkg库和MCR
libPkgTerminate();
mclTerminateApplication();


其中libPkg.h为mcc命令编译后的库文件。该文件结构清晰,首先程序代码包含相关必要的头文件和libPkg.h文件,主程序入口,变量的定义,然后初始化MCR和libPkg函数库,调用magicCreat.m编译后的文件mlfMagicCreat,调用结果用矩阵R存储,最后释放内存空间,并结束libPkg库和MCR。在程序结束之前及时地释放内存空间是一个很好的编程习惯。将该程序存储为magicCreatCFile.c,接下来使用mcc命令编译该文件,在MATLAB命令行窗口中输入:

mcc -W lib:libPkg -T link:exe magicCreat magicCreatCFile.c main_for_lib.c

经过mcc命令编译后,可以发现在当前路径下,出现一个magicCreat.exe文件,为一个可执行程序文件,在MATLAB命令行窗口输入:
>> !magicCreat

Extracting CTF archive. This may take a few seconds, depending on the
size of your application. Please wait...
...CTF archive extraction complete.
y =

17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

程序正常运行,由于命令行输入变量个数小于2,因此M文件输入参数默认值为5,程序产生一个5阶的魔方阵,如果需要输入第2个输入参数,则可以按照以下方式在MATLAB命令行窗口中输入:
>> !magicCreat 3 %创建一个3阶的魔方阵

y =

8 1 6
3 5 7
4 9 2

但是 在%matlabroot%\ extern\examples\compiler 下面找不到说说的文件……链接libPkg.h出错……

麻烦解决下

20分先放这,会追加的~~

参考技术A 楼主的matlab是哪版,貌似05b以后就不能在c中直接调用MATLAB数学函数库了。
能用的只有在c中创建一个matlab engine,通过调用engine实现条用相应的数学函数。不过很慢,不建议使用。
参考技术B 怎么会找不到呢?安装目录找对了吗?我的目录是:
D:\program files\MATLAB\R2007a\extern\examples\compiler本回答被提问者采纳
参考技术C 搜索该头文件,复制到你的工程中去,然后添加。再编译试试。

以上是关于在c++中调用MATLAB函数的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Matlab 调用具有多个输出的 C++ 函数?

C++调用Matlab函数求特征值

转C++调用Matlab的.m文件

[转] Matlab与C++混合编程(依赖OpenCV)

linux c++ 怎么 调用自己函数的

C++中CFile open函数怎么创建不了文件