matlab r2012a win10,vs2010和Matlab R2012a 混合编程
注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令輸入后可能會找不到vs2010編譯器。
2.書寫m文件
示例如下:
function [ c ] =
MyAdd( a,b )
%UNTITLED Summary of
this function goes here
% ?Detailed explanation goes here
c=a+b;
end
保存為MyAdd.m
3.創(chuàng)建動態(tài)鏈接庫
Matlab中輸入:mcc -W
cpplib:libMyAdd -T link:lib MyAdd -d [生成文件路徑]
其中,mcc是Matlab提供的編譯命令,對于這一點(diǎn),Matlab的幫助說明如下:-W?lib:string?link:lib其中-W是控制編譯之后的封裝格式,cpplib,是指編譯成C++的lib,cpplib冒號后面是指編譯的庫的名字,-T表示目標(biāo),link:lib表示要連接到一個庫文件的目標(biāo),目標(biāo)的名字是后面的MyAdd,即你寫的m函數(shù)的名字。運(yùn)行完之后,你的目錄下面,將會出現(xiàn)以下一些文件:libMyAdd.cpplibMyAdd.explibMyAdd.dlllibMyAdd.exportslibMyAdd.hlibMyAdd.libmccExcludedFiles.logreadme.txt具體每一個文件的意思,請查幫助,這里只說其中很有用的幾個:libMyAdd.dll是編譯好的動態(tài)庫,MyAdd這個函數(shù)封裝在里面,libMyAdd.h是對應(yīng)的頭文件,在C里面調(diào)用這個函數(shù)的時候,需要include這個頭文件在這個頭文件的最后,你可以看到下面的內(nèi)容:extern?LIB_libMyAdd_CPP_API?void?MW_CALL_CONV?MyAdd(int?nargout,?mwArray&?c,?const?mwArray&?a,?const?mwArray&?b);這就是MyAdd的C函數(shù)的聲明。nargout表示輸出變量的個數(shù),a,b,c就是對應(yīng)了m函數(shù)的幾個變量。注意,a,b,c三個變量的類型是mwArray,這是Matlab提供的一個特殊的變量類型(在7.0的版本,編譯之后,變量類型是mxArray)。mwArray是一個類,具體可以查幫助。
4.系統(tǒng)環(huán)境配置
Computer?-?>?Properties?->?Advanced?system?settings?->?Environment?Variables?->?User?Variables?->?path,?添加(MATLAB下為MATLAB
2012軟件安裝目錄)
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
Computer?-?>?Properties?->?Advanced?system?settings?->?Environment?Variables?->?System?Variables?->?path,?添加
...\MATLAB\runtime\win32;
...\MATLAB\bin;
...\MATLAB\extern\lib\win32\microsoft;
...\MATLAB\bin\win32
5.vs2010環(huán)境配置
a.創(chuàng)建一個console?application,并新建一個cpp文件(否則之后Property?Pages中沒有C/C++目錄)
b.?設(shè)置目錄
①Property?Pages?->?VC++?Directories?->?Include?Directories,?添加(安裝目錄下)
...\MATLAB\extern\include\
②Property?Pages?->?VC++?Directories?->?Library?Directories,?添加
...\MATLAB\extern\lib\win32\microsoft
③Property?Pages?->?C/C++?->?General?->?Additional?Include?Directories,?添加
...\MATLAB\extern\include\
④Property?Pages?->?Linker?->?General?->?Additional?Library?Directories,?添加
...\MATLAB\extern\lib\win32\microsoft
⑤Property?Pages?->?Linker?->?Input?->?Additional?Dependencies,?添加
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
libMyAdd.lib
6.vs2010下完成程序
把剛才生成的lib*.h?lib*.dll?lib*.lib文件復(fù)制到剛剛新建的工程的文件夾下,并且用添加—現(xiàn)有項添加的工程中。(此處的*代表你的m文件名稱)
其中testmat3.cpp程序如下:
#include
#include
#include
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "libMyAdd.h"
using namespace std;
int main()
{
double a = 6;
double b = 9;
double c;
// initialize lib,這里必須做初始化!
if( !libMyAddInitialize())
{
std::cout <
libMyAdd!" << std::endl;
return -1;
}
// 為變量分配內(nèi)存空間,可以查幫助mwArray
mwArray mwA(1, 1, mxDOUBLE_CLASS); //
1,1表示矩陣的大小(所有maltab只有一種變量,就是矩陣,為了和Cpp變量接軌,設(shè)置成1*1的矩陣,mxDOUBLE_CLASS表示變量的精度)
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS);
// set data,不用我解釋了吧,很簡單的,調(diào)用類里面的SetData函數(shù)給類賦值
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
// using my add,掉我自己寫的函數(shù)
MyAdd(1, mwC, mwA, mwB);
// get data,不用我解釋了吧,很簡單的,調(diào)用類里面的Get函數(shù)獲取取函數(shù)返回值
c = mwC.Get(1, 1);
std::cout<
<
// 后面是一些終止調(diào)用的程序
// terminate the lib
libMyAddTerminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
7. 程序運(yùn)行結(jié)果:
出現(xiàn)此結(jié)果基本上就說明混合編程成功了。
注:如果m文件中有畫圖方面的函數(shù),則前邊一定要有延時函數(shù),或者在c程序中m函數(shù)調(diào)用后加上getchar(),否則當(dāng)lib和MCR被terminated后圖像會被關(guān)閉----即程序運(yùn)行后會出現(xiàn)圖像“一閃而過”的效果!
8. 參考資料:
(1)<>
by?lihui-mn@163.com
(2)<
與c++混合編程>> --------matlab r2011a and
vs2010
以上過程其實還大可簡化。如有問題,歡迎交流!
總結(jié)
以上是生活随笔為你收集整理的matlab r2012a win10,vs2010和Matlab R2012a 混合编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php读取文件和读取redis,PHP结
- 下一篇: opencart mail.php,如何