matlab與c混合編程pdf
『壹』 matlab與才c/c++混合編程
用Matlab編譯C語言生成的代碼效率並不高.如果真想有效的在Windows環境下調用數學工具的鏈接庫或com文件,建議還是用Microsoft Math v3.0.
『貳』 matlab與C混編
最好是在C中調用MATLAB ,因為C 比MATLAB靈活,MATLAB語言很強大,但是它是在處理數據方面的性能很好。可是它在開發平台上有一定局限性,用外部語言來調用MATLAB,正好彌補了這一不足。
建議用VC 6.0 做 ,操作比較簡單
Matlab 是數值計算及圖形處理軟體,可以實現數值分析、優化、統計、偏微分方程數值解、自動控制、信號處理、圖像處理等若干領域的計算和圖形顯示功能。其中,控制系統工具箱的集成為設計和分析各種復雜的控制系統提供了有效的方法和途徑。
但是,由於Matlab開發平台的局限性,在其上面開發的程序不能脫離Matlab運行環境,因而在處理一些實際應用問題時顯得靈活性不足,而VC++則在一定程度上能夠彌補這一漏洞,因此,現將二者結合共用,各獻其長,可以為科研工作和工程開發提供了更為強大的技術支持。
1、Matlab與VC混合編程的實現方法
Matlab作為控制系統設計的一種通用工具,它可以和VC方便的進行連接。一般而言,Matlab與VC混合編程的實現方法主要有以下三種方法:(1)通過引擎(Engine),採用客戶機伺服器的計算模式,通過Window的ActiveX通道和Matlab進行連接。具體應用時,往往在VC中設計程序框架,以編譯的程序作為前端客戶機;通過調用Matlab引擎在後台實現與伺服器的連接,實現動態通信(2)應用Matlab數學函數庫,Matlab中包含了內容豐富的函數庫,而且還提供了與VC的數學函數介面,用戶可以方便的在VC的IDE(集成開發環境)中調用。(3)通過DLL實現VC與Matlab的混合編程。DLL是一個可執行的二進制文件。把很多通用的功能放在DLL中,可以供多個應用程序調用,這樣可以很好的減少外部存儲空間的佔有量,並實現代碼的共享[2]。在上述三種方法中,第一種方法對調用Matlab的工具箱很實用,所有在進行控制系統的設計和分析時,一般都是通過調用Matlab引擎(Engine)來實現的。
要想在VC集成環境下利用Matlab引擎實現VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:
(1)Visual C++6.0 編譯環境的設置:通過菜單 Tools/ Options,打開Visual C++6.0設置屬性頁,進入 Directorie頁面,在 Show Directories for下拉列表中選擇Include Files,添加路徑:D:\Matlab6p5\extern\include(在Matlab的安裝路徑下);再選擇下拉列表中的 Library Files,添加路徑:D:\Matlab6p5\extern\ lib\win32\Microsoft\msvc60(在Matlab的安裝路徑下)。編譯環境只需設置一次。
(2)添加庫文件: 通過菜單 Projects|settings,進入 Link 頁面,在 Object/Library Moles 框中,添加庫文件名:libmx.lib 、libmat.lib 、libeng.lib。每個新的工程文件都要單獨添加庫文件。
(3)在使用 engine 函數的程序頭文件中包含如下兩個頭文件:
#include "engine.h"
#include <stdlib.h>
(4)在應用程序中添加調用Matlab引擎的程序代碼:
{
Engine *ep;
if(!(ep=engOpen(" \0"))) //打開Matlab引擎,建立與本地Matlab的連接
{
fprintf(stderr,"\n Can't start MATLAB engine\n");
exit(-1);
}
以上步驟是對VC與Matlab混合編程的編譯環境進行設置,在完成了以上基本步驟後就可以利用Matlab引擎庫函數engEvalString來調用Matlab的內建函數了。
記得在C程序中加上頭文件#include "matlab.h" 。
『叄』 matlab與c混合編程,engOpen()的問題,matlab引擎啟動不了
使用engOpen()打開Matlab引擎總是失敗,問題可能就是Matlab組件沒有注冊。注冊方法:點擊開始/運行/cmd,在命令行提示窗口下更改到Matlab安裝路徑/bin,運行指令
matlab/regserver,注冊成功後會彈出Matlab 命令窗口。
『肆』 高峰懸賞<精通Matlab與C_C++混合編程>電子版
MATLAB是一門計算機編程語言,取名來源於Matrix Laboratory,本意是專門以矩陣的方式來處理計算機數據,它把數值計算和可視化環境集成到一起,非常直觀,而且提供了大量的函數,使其越來越受到人們的喜愛,工具箱越來越多,應用范圍也越來越廣泛。MATLAB的發展歷史見下表1-1。(年份不詳的請知道的網友補充。)時間
版本
1985 1.0
1986 2.0(含控制系統工具箱)
1988 3.9
1993 4.0(含Simulink1.0)
1994 4.2(含simulink2.0)
不詳 4.3
不詳 5.3
2000 6.0(含Simulink4.0)
2001 6.1(含Simulink4.1)
不詳 6.21
2003 6.5
1.1 安裝
MATLAB的安裝非常簡單,這里以Windows版本6為例。運行setup後,輸入正確的序列號,選擇好安裝路徑和安裝的模塊,幾乎是一直回車就可以了。這里有一點要注意的是,由於不同操作系統設置,可能會出現一些意外錯誤,而且越高版本的MATLAB對計算機系統的要求也越高,如6.1版本要求至少64M內存,最好128M。所以根據自身情況選擇適合的版本安裝,最好還要在操作系統初安裝後就安裝,避免出現意外。
1.2 運行
MATLAB的啟動運行:#:\MATLAB6p1\bin\win32\matlab.exe(其中#為安裝盤符。)但一般安裝完畢後會在安裝目錄下有一個快捷運行方式。
MATLAB啟動後顯示的窗口稱為命令窗口,提示符為「>>」。一般可以在命令窗口中直接進行簡單的算術運算和函數調用。如果重復輸入一組表達式或計算復雜,則可以定義程序文件來執行達到目的。程序文件擴展名為「.m」,以文本文件形式保存。有兩種方式運行程序文件:一是直接在MATLAB命令窗口輸入文件名,二是選擇File->Open打開m文件,彈出的窗口為MATLAB編輯器。這時可選擇它的Debug菜單的Run子菜單運行。
1.3 幫助文件
學習MATLAB軟體最好的教材是它的幫助文件。只要硬碟容量夠大,極力推薦安裝完整的幫助文檔,即使你對閱讀英文不是很有信心,但我相信其足夠的實例還是能讓你對要查詢的命令函數有一定的了解的。有兩種方法取得幫助信息:一是直接在命令窗口輸入>>help 函數名;如help imread,會得到相應函數的有關幫助信息。二是在幫助窗口中查找相應信息。不同版本的幫助菜單界面有所不同,這只能依賴於你自己去熟悉了。但總體上都和windows的界面具有相似的處理過程。
1.4 MATLAB所定義的特殊變數及其意義變數名 意義
help 在線幫助命令, 如用help plot調用命令函數plot的幫助說明。
who 列出所有定義過的變數名稱
ans 最近的計算結果的變數名
eps MATLAB定義的正的極小值=2.2204e-16
pi π值3.14159265...
inf ∞值,無限大
NaN 非數
1.5 MATLAB中的運算符和特殊字元說明符號
符號用途說明
+ 加
- 減
.* 點乘 詳細說明help arith
* 矩陣相乘
^ 矩陣求冪
.^ 點冪
\ 左除 詳細說明help slash
/ 右除
.\ 點左除
./ 點右除
kron 張量積 詳細說明help kron
, 作分隔用,如把矩陣元素、向量參數、函數參數、幾個表達式分隔開來
; (a)寫在一個表達式後面時,運算後命令窗口中不顯示表達式的計算結果
(b)在創建矩陣的語句中指示一行元素的結束,例如m=[x y z;i j k]
: (a)創建向量的表達式分隔符,如x=a:b:c
(b)a(:,j)表示j列的所有行元素;a(i,:)表示i行的所有列元素;a(1:3,4)表示第四列的第1行至第3行元素
() 圓括弧
〔〕 創建數組、向量、矩陣或字元串(字母型)
{} 創建單元矩陣(cell array)或結構(struct)
% 注釋符,特別當編寫自定義函數文件時,緊跟function後的注釋語句,在你使用help函數名時會顯示出來。
' (a)定義字元串用
(b)向量或矩陣的共軛轉置符
.' 一般轉置符
... 表示MATLAB表達式繼續到下一行,增強代碼可讀性
= 賦值符號
== 等於關系運算符
<,> 小於,大於關系運算符 詳細說明help relop
& 邏輯與
| 邏輯或
~ 邏輯非
xor 邏輯異或
參考資料:http://..com/question/3476662.html?fr=qrl3
『伍』 matlab神經網路與c混合編程問題
A= mxCreateDoubleMatrix(1, inputNum, mxREAL);
memcpy((char *) mxGetPr(A), (char *) input, inputNum*sizeof(double));
engOutputBuffer(ep, buffer, 1000);
engEvalString(ep,"load('bptest.mat','-mat');");
engEvalString(ep,"y=sim(Net,A');");
result=engGetVariable(ep
『陸』 如何將c文件在matlab simulink中混編
方法/步驟
菜單:工程→ 屬性... 選擇配置屬性下的 VC++ 目錄。在包含目錄欄目中添加matlab相關的include文件。我的matlab裝在F盤中,只要把F:\MatLab\extern\include\win64和F:\MatLab\extern\include兩個目錄配置上去就好,這里注意下要是win64的vs所建立的工程必須是x64的,否則會出錯,比較低的版本則沒有win64,只有win32 這樣是建立一個x86或win32工程即可
在 庫目錄欄目中添加matlab相關的lib文件。例如:F:\MatLab\extern\lib\win32\microsoft;F:\MatLab\extern\lib\win32;F:\MatLab\extern\lib\win64\microsoft;F:\MatLab\extern\lib\win64;
注意這里是針對於不同的工程和機器位數,最好全部加上去,以免出錯。
菜單:工程 屬性 選擇配置屬性下的 連接器→ 輸入。
在 附加依賴項 欄目中輸入項目需要引用matlab的的lib文件庫。
libmat.lib libeng.lib libmx.lib
菜單:工程 屬性 選擇配置屬性下的 連接器→ 常規。
在 附加庫目錄 欄目中,添加庫所在的目錄名稱。如:F:\MatLab\bin\win64
這一步相當的重要,不然的話,各種dll文件找不到,lib文件找不到之類的報錯。
測試:從網上隨便找一個代碼
#include <iostream>#include <iomanip>using namespace std;#include <engine.h>#include <string.h>
void main(){ // 定義循環變數 int i = 0, j = 0;
// 狀態變數
int nStatus = 0; // 定義MATLAB引擎指針 Engine *ep;
// 定義mxArray變數指針 mxArray *A, *B;
// 定義矩陣數組
// 注意:VC中矩陣的行列次序與MATLAB正好時相反,需要轉置。 double arData[3][3] = {{7.5,16.3,9.6},{13.2,8.9,12.3},{9.6,5.4,13.7}}; double arResData[3][3];
// 輸出原矩陣 cout<<"原矩陣為:"<<endl; for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { cout<<setw(10)<<arData[i][j]<<" "; } cout<<endl; } // 打開MATLAB引擎 ep = engOpen(NULL); if(ep == NULL) { cout<<"無法打開MATLAB引擎。"<<endl; exit(EXIT_FAILURE); }
// 是否顯示MATLAB窗口:true-顯示;false-隱藏。
nStatus = engSetVisible(ep, false);
if(nStatus != 0)
{
cout<<"設置MATLAB顯示屬性失敗。"<<endl;
exit(EXIT_FAILURE);
}
// 為mxArray變數分配空間 A = mxCreateDoubleMatrix(3,3,mxREAL); B = mxCreateDoubleMatrix(3,3,mxREAL); if(A == NULL || B == NULL) { cout<<"為mxArray變數分配空間失敗。"<<endl;
exit(EXIT_FAILURE); }
// 將數組中的數據寫入到mxArray空間中
memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData));
// 將矩陣變數A寫入到MATLAB引擎空間
nStatus = engPutVariable(ep,"A",A);
if(nStatus != 0)
{
cout<<"矩陣變數寫入MATLAB引擎空間失敗。"<<endl;
exit(EXIT_FAILURE);
}
// 執行引擎命令求矩陣A的逆矩陣
nStatus = engEvalString(ep,"B=inv(A)");
if(nStatus != 0)
{
cout<<"執行MATLAB引擎命令失敗。"<<endl;
exit(EXIT_FAILURE);
}
// 從MATLAB引擎空間中讀取執行結果
B = engGetVariable(ep,"B");
// 將矩陣變數B復制到數組arResData中
memcpy((void*)arResData,(void*)mxGetPr(B),sizeof(arResData));
// 釋放矩陣變數空間
mxDestroyArray(A);
mxDestroyArray(B);
// 關閉MATLAB引擎
engClose(ep);
// 輸出計算結果
cout<<"逆矩陣為:"<<endl;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
cout<<setw(10)<<arResData[i][j]<<" ";
}
cout<<endl;
}
// 暫停程序,查看結果
system("pause");
}
『柒』 matlab和c混合編程如何運行
簡單點的,你就用matlab寫一個介面程序,封裝你的c程序,類似下面這種:(matlab的例子,實現數組相乘,文件為arrayProct.c)
#include "mex.h"
/* 你的c */
void arrayProct(double x, double *y, double *z, mwSize n)
{
mwSize i;
/* multiply each element y by x */
for (i=0; i<n; i++) {
z[i] = x * y[i];
}
}
/* 介面程序 */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
/*初始化輸入輸出*/
double multiplier; /* input scalar */
double *inMatrix; /* 1xN input matrix */
mwSize ncols; /* size of matrix */
double *outMatrix; /* output matrix */
/* 參數檢查,如果程序較簡單也可以不用做*/
if(nrhs!=2) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:nrhs","Two inputs required.");
}
if(nlhs!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:nlhs","One output required.");
}
/* make sure the first input argument is scalar */
if( !mxIsDouble(prhs[0]) ||
mxIsComplex(prhs[0]) ||
mxGetNumberOfElements(prhs[0])!=1 ) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:notScalar","Input multiplier must be a scalar.");
}
/* check that number of rows in second input argument is 1 */
if(mxGetM(prhs[1])!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProct:notRowVector","Input must be a row vector.");
}
/* get the value of the scalar input */
multiplier = mxGetScalar(prhs[0]);
/* create a pointer to the real data in the input matrix */
inMatrix = mxGetPr(prhs[1]);
/* get dimensions of the input matrix */
ncols = mxGetN(prhs[1]);
/* create the output matrix */
plhs[0] = mxCreateDoubleMatrix(1,ncols,mxREAL);
/* get a pointer to the real data in the output matrix */
outMatrix = mxGetPr(plhs[0]);
/* call the computational routine */
arrayProct(multiplier,inMatrix,outMatrix,ncols);
}
這個看起來復雜,其實很簡單的,就幾步:
1、使用mxGet*將輸入變為matlab兼容形式
2、使用mxSet*初始化輸出空間
3、使用你的C程序運算
『捌』 matlab與c/c++混合編程,急!
目前常用的的是4.5版本,包含matlab.h頭文件,和v4501v.dll
ago4501兩個動態庫即可。
具體可參考matcom幫助或者留言給我
