當前位置:首頁 » 編程軟體 » vs2010matlab混合編程

vs2010matlab混合編程

發布時間: 2025-08-05 19:48:54

A. 如何vs2010mfc調用matlab 2010生成dll進行編程

通常在實現圖像處理的演算法時我們使用Matlab編程,因為它具有豐富的庫函數以及操作方便,然而在工程項目中通常使用C/C++語言。如果我們將matlab代碼完全重寫成C++代碼會很麻煩,最好的辦法是藉助matlab與C/C++介面將.m程序轉成dll文件!
一、使用matlab將.m轉成dll文件
1、在命令行中輸入mex -setup
提示你是否要在本地安裝matlab compilers,然後選擇compiler類型,有matlab自帶的編輯器以及檢測到的其他編輯器,比如「Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio」,根據自己實際情況選擇。
2、在命令行中輸入mbuild -setup
這里的選項和上面類似,依次選擇環境確定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add表示生成的dll文件名,後面的add.m顧名思義是.m文件名。生成後會多出8個文件,有用的是add.ctfadd.dll add.lib add.h4個文件,據說新版的Matlab不會生成.ctf文件。
二、VC6.0中調用生成的dll文件
上面生成的dll文件,我們可以藉助VC6.0的Depends工具查看導出函數名,但是我們要調用導出函數必須要知道函數的形參返回類型等,這里要藉助.h文件,它包含了導出函數的聲明,下面以實例來講解使用方法:
1、add.m文件
function [a,b]=add(x,y)
a=2*x+y;
b=3*y;
end

注意了add函數有兩個返回值,可以猜測一下在C++中是如何處理的;
2、add.h文件
截取其中一段關鍵代碼如下:
extern void add(int nargout, mwArray& a, mwArray& b
, const mwArray& x, const mwArray& y);

實際上函數的返回是變相的放到形參中的,依次是輸出參數個數,輸出參數,輸入參數。PS 現在做的這個項目中用戶自定義演算法dll使用的規則和這里類似!
3、C++中調用dll文件
(1)新建空工程,將上面提及的4個文件放到工程目錄下;
(2)VC++目錄中包含目錄:matlab 內的include目錄
比如我的是 E:\MATLAB7\extern\include
(3)VC++目錄中庫目錄:matlab 內的lib目錄
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根據VC++版本修改!
(4)工程屬性-》連接-》輸入-》附加依賴項
輸入:add.lib mclmcrrt.lib mclmcr.lib,第一個是生成的。或者在預處理中加入下面代碼
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "add.lib")

4、C++代碼
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl;
return -1;
}

mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);

a(1,1)=20;
b(1,1)=30;

mwArray x(1,1,mxDOUBLE_CLASS);
mwArray y(1,1,mxDOUBLE_CLASS);

//輸出參數個數,輸出參數,輸入參數。
add(2,x,y,a,b);

double *i=new double;
double *j=new double ;

x.GetData(i,1);
y.GetData(j,1);

cout<<"x="<<*i<<" y="<<*j<<endl;
getchar();
return 0;
}

注意:addInitialize()一定要!

B. 如何在MATLAB R2010a 中使用Visual C++ 2010編譯

1、安裝補丁VS2010MEXSupport.zip

由於MATLAB R2010a 發布的時間要比 VS2010早,所以在該版本識別不了VC++2010編譯器。不過R2010a之後的版本應該不會有這種問題了。

解壓補丁包,將其中的文件放到 D:Program 文件夾下。

2、在MATLAB中安裝VC++ 2010 編譯器

打開Matlab,在 command window 中輸入 mex -setup

>> mex -setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?n (一定要選擇 n)

Select a compiler:
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[2] Intel C++ 9.1 (with Microsoft Visual C++ 2005 SP1 linker)
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[4] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)
[5] Intel Visual Fortran 10.1 (with Microsoft Visual C++ 2005 SP1 linker)
[6] Lcc-win32 C 2.4.1
[7] Microsoft Visual C++ 6.0
[8] Microsoft Visual C++ 2005 SP1
[9] Microsoft Visual C++ 2008 Express
[10] Microsoft Visual C++ 2008 SP1
[11] Microsoft Visual C++ 2010
[12] Microsoft Visual C++ 2010 Express
[13] Open WATCOM C++
[0] None
Compiler:12

注意,如果選擇 n 之後,沒有列出這么多編譯器選項,甚至沒有出現VC++ 2010。 不要慌,此時選擇 0,即None。

Compiler: 0

mex: No compiler selected. No action taken.
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the new
API. You can find more information about this at:
http://www.mathworks.com/support/solutions/en/data/1-5C27B9/?solution=1-5C27B9
Building with the -largeArrayDims option enables the new API.

然後在command window 里再次輸入 mex -setup。

>> mex -setup
Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?n (一定要選擇 n)

此時就會列出很多編譯器,包括已經VC++2010。如果還沒有,可重復幾次以上過程。當然前提是必須安裝VS2010,否則,再怎麼重復,也找不到VC++2010編譯器。

列出VC++2010編譯器之後,我相信接下該怎麼做對大家來說沒問題。


3、error C2371: 'char16_t' : redefinition; different basic types

在混合編程中,也許會出現如下錯誤:

C:Microsoft Visual Studio 10.0VCINCLUDEyvals.h(576) : error C2371: 'char16_t' : redefinition; different basic types
C:.h(330) : see declaration of 'char16_t'

原因是VS2010中的yvals.h添加了char16_t的定義,而Matlab的matrix.h也包含對char16_t的定義,所以同時包含這兩個頭文件的話,會導致重復定義char16_t的錯誤。

完全沒有必要修改這兩個頭文件(以防修改之後,會在將來導致一些問題),只需要在包含matrix.h之前包含yvals.h即可。例如:

#include<yvals.h>
#if(_MSC_VER>=1600)
#define__STDC_UTF_16__
#endif
#include"mex.h"

mex.h 包含matrix.h。這就要求我們必須知道所包含的頭文件是否包含matrix.h。

C. 怎麼用matlab code封裝matlab演算法製作獨立的動態鏈接庫

一,設置操作系統的環境變數。

系統變數增加D:R2011abinwin32;D:R2011abin和E:Microsoft Visual Studio 10.0VCbin,這個分別是我的機器上matlab和VS安裝目錄下的路徑。

系統變數設置完畢後需要重新啟動計算機方能生效。

二,設置matlab的編譯環境

在matlab中輸入命令mex -setup,選擇Microsoft Visual C++ 2010

再輸入命令mbuild -setup 同樣選擇Microsoft Visual C++ 2010

p.s. 這一步中,在我自己配置的過程中,matlab可以很容易的識別出機器上裝有的編譯器以及他們的安裝路徑,其中包括VS2010,選擇它就是了。也許有的環境下matlab不一定能找出VS2010中的VC編譯器,這個怎麼解決就不知道了。

三,matlab編譯.m文件

輸入mcc -W cpplib:yourfunLib -T link:lib yourfun.m

其中,yourfunLib是生成的DLL,Lib的前綴名字,也就是你最後可以是使用的DLL以及Lib庫的名字;yourfun是你需要編譯的.m函數。

編譯完成後得到了下圖中的一些文件:

這些文件中後綴為DLL,LIB,H的文件在VS調用的時候有用,其他文件目前沒有使用。(這里我把yourfunLib指定為aetherLib了)

四,VS2010 的配置

新建一個控制台項目。

打開項目的屬性頁,針對這個項目做如下的設置:

1.VC++目錄下的包含目錄添加

D:R2011aexterninclude(matlab安裝目錄下的路徑)

D:R2011aexternincludewin32(matlab安裝目錄下的路徑,下同)

C:(你自己新建的項目中的路徑,下同)

2.VC++目錄下的庫目錄添加

D:R2011abinwin32

D:R2011aexternlib

C:

D:R2011aexternlibwin64microsoft

D:R2011aexternlibwin32lcc

D:R2011aexternlibwin32microsoft

3.c/c++中的常規裡面的附加包含目錄添加

D:R2011aexterninclude

4.連接器下面的常規中的附加庫目錄添加

D:R2011aexternlibwin32microsoft

5.連接器下面的輸入中的附加依賴項添加

libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
aetherLib.lib(這個是你自己用matlab生成的lib,前面的是matlab自身計算引擎中的lib)

在解決方案資源管理其中的頭文件和資源文件中添加文件

1.在頭文件中添加生成的.h文件

2.在資源文件中添加.lib,.dll文件

3.然後 把.h,.lib,.dll文件拷到你新建的項目的目錄下。比如我把他們放到了C:裡面。

編寫代碼調用dll中的函數

dll中的函數的介面形式在.h文件的最後面給出了,你可以去翻看他介面形式。這裡面的函數的輸入輸出參數都得是mwArray對象的常引用,關於這個類請讀者自己去網上搜索資料。你需要搞明白的是mwArray是matlab公司專門針對「c++調用matlab生成的dll「 而設計的類,因為你包含了matlab安裝目錄下的這些類,所以你可以在VS里使用它們。

下面是一段主函數的編寫樣例:

// newdll.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include
#include "engine.h"
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libMyAdd.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
if(!libMyAddInitialize())
{
//initilize failed!!!"<<std::endl;
std::cout<<"錯誤..."<<std::endl;
return -1;

}
double a = 6;

double b = 9;

double c;
mwArray mwA(1, 1, mxDOUBLE_CLASS);

mwArray mwB(1, 1, mxDOUBLE_CLASS);

mwArray mwC(1, 1, mxDOUBLE_CLASS);

mwA.SetData(&a, 1);

mwB.SetData(&b, 1);
MyAdd(1, mwC, mwA, mwB);
c = mwC.Get(1,1);
cout<<c<<endl;
system("PAUSE");
return 0;
}

這個dll中的函數只是實現了一個簡單的兩數相加的功能,是我做基本配置是使用的。

#include "engine.h"
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libMyAdd.h"這些頭文件是必須包含的,其中engine好像是包含了matlab計算引擎中的所有dll(還沒有認真考證)

現在,運氣好的話你應該能看到你預想中的輸出了。如果出現了問題,比如找不到路徑,不可訪問等等各種錯誤,那隻能你自己去解決了,我搞了整整3天,上面提到的錯誤都有遇到。出了錯誤你可以嘗試去網路搜索其他博客,更好的是去google用英文搜索相關的問題,一些社區裡面也許有答案呢,matlab版主文檔我倒是沒仔細看,也許上面也有不錯的幫助呢! good luckto you!

備註:

1.我自己在搞的時候,遇到的問題是.m函數中本身就使用了c++語言編寫的dll,然後再封裝這個.m函數。這種情況下你得保證VS可以訪問到你用到的那些用C++書寫的dll。但是只要用mcc命令編譯.m函數後,你在連接器下面的輸入中的附加依賴項中只需添加.m 生成的dll函數就可以了,不需要添加那些c++代碼生成的dll。這里建議你把matlab項目拷到VS項目中,直接在Vs項目中工作進行MCC編譯。

2.主函數代碼中if(!libMyAddInitialize())是必須的。

D. vs2010怎樣讀取.mat文件

mat數據格式是matlab的數據存儲的標准格式。
可以在Matlab中象M文件一樣打開,數據進入workspace
可以調用matlab的子程序庫,用c或fortan調用mat格式的數據。
給你幾個函數名
matopen 打開mat文件
matclose 關閉mat文件
magetfp 取得mat文件的c語言句柄
matGetArray 取得一個數組

熱點內容
外幣存款ftp利差計算 發布:2025-08-06 17:53:18 瀏覽:709
查看存儲過程命令 發布:2025-08-06 17:44:45 瀏覽:324
android獲取日歷 發布:2025-08-06 17:39:42 瀏覽:529
呂布5000血銘文如何配置 發布:2025-08-06 17:22:25 瀏覽:308
差動式壓縮機 發布:2025-08-06 17:15:44 瀏覽:892
華為p30更新鴻蒙系統如何退回安卓 發布:2025-08-06 17:12:24 瀏覽:536
新款大眾探歌有哪些配置 發布:2025-08-06 17:05:36 瀏覽:187
如何刪除sd卡存儲內容oppo 發布:2025-08-06 17:00:31 瀏覽:242
互動游戲編程 發布:2025-08-06 16:56:11 瀏覽:613
資料庫的完整性約束條件 發布:2025-08-06 16:53:05 瀏覽:419