當前位置:首頁 » 編程軟體 » C和MATLAB的混合編程

C和MATLAB的混合編程

發布時間: 2022-08-12 01:35:09

1. c語言與matlab混合編程怎麼生成m文件

通過matcom混合編程。

首先把matlab語言轉換成dll,可以在c裡面調用。

當然,新版本的matlab可以把m語言直接轉換成標准c

2. 哪位大俠知道vc和matlab混合編程

MATLAB 與Visual C++結合的方法有多種,但其實用程度與范圍不同。目前主要有以下三種方式。
1. 通過Matlab引擎(Engine)
採用客戶機/伺服器(Client/Service)的計算模式,通過windows的ActiveX通道和MATLAB進行結合。MATLAB引擎採用客戶機和伺服器計算方式,提供了一組Matlab API函數,用戶不必關心Matlab引擎是如何實現的,只要調用這些函數即可。正是通過這些API函數實現應用程序進程之間的傳遞函數,從而實現Matlab與VC的混合編程。具體應用中,往往在VC中設計程序框架, VC的C語言或C++語言的程序作為前端客戶機,它向Matlab引擎傳遞命令和數據信息,通過調用MATLAB引擎在後台與MATLAB伺服器建立連接,實現動態通信。這種處理方法不要求鏈接整個Matlab,只需嵌入必要的Matlab引擎庫,節省了大量的系統資源,使應用程序整體性能更好,處理效率更高,但這種混合編程的方法需要MATLAB在後台適時運行不能脫離Matlab環境,否則影響了程序的通用性,因此這種方法在實際開發過程中很少採用。
2. 通過DLL實現混合編程
DLL是動態鏈接庫的英文縮寫,是一個可執行的二進制文件。把很多通用的功能放在DLL 中,可供多個應用程序調用,而不是每個應用程序在連接時都要增加一個庫中目標代碼的拷貝。通過Matlab自帶的Compiler編譯器,可以把由Matlab編寫的m 函數文件編譯成動態鏈接庫(dl1)。或者通過Matlab提供的組件功能,運用VC+十向導自動生成m文件的動態鏈接庫。在VC程序中調用封裝的函數,實現數值演算法的運用。這種方法只需在開發和發布中包含其生成的動態庫就可以了,可以使程序脫離Matlab可以整體減少文件外部存儲空間的佔有量,並實現了代碼共享。
3.使用COM技術實現混合編程
COM技術是一種應用廣泛、方便靈活的方法,是利用MATLAB提供的Deploy Tool工具實現MATLAB與C/C++的混合編程。COM給軟體開發人員提供了一種共享二進制代碼的方法,這種共享並不局限於某種編程語言。

3. 如何將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");
}

4. 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程序運算

5. matlab與c/c++混合編程,急!

目前常用的的是4.5版本,包含matlab.h頭文件,和v4501v.dll
ago4501兩個動態庫即可。
具體可參考matcom幫助或者留言給我

6. 如何將MATLAB文件與c#混合編程

沒有做過這方面的編程,不過之前在雜志上看過相關的文章,是基於MatlAB與VB的混合編程,由於MatlAB不能開發可執行文件,程序必須在其環境運行,MatlAB提供了與其他高級語言的介面,以實現它們的混合編程。
文章介紹了兩種介面方法:引入1.Matrix
VB
2.藉助Matcom將MatlAB函數轉換為VB可調用的DLL文件。具體方法你可以查看相關資料

7. matlab與c 混合編程 大概可提速多少倍

我做圖像處理的時候,先是用MATLAB,因為有大量的循環處理,其運行時間將近一分鍾,後來改用MATLAB與C混合,時間縮短至0.09秒,時間之差,真的是不可估量。

但是,情況不完全如此,MATLAB優點在於矩陣運算中,如果你的程序中有大量的矩陣運算,那麼混合編程個人不是很建議;C語言優點在於循環速度很快。

我也有這樣的經歷,我的演算法中有大量的矩陣運算(由於我是做圖像處理,矩陣基本上是512*512的),本來用MATLAB編程用了9秒左右的時間,但是改用了C混合後,N長時間,反正我是等了將近一分鍾,混合程序我是檢驗過的,沒有死循環的。

以上這些完全個人經驗之談,希望對您有個幫助。

8. matlab與c混合編程,engOpen()的問題,matlab引擎啟動不了

使用engOpen()打開Matlab引擎總是失敗,問題可能就是Matlab組件沒有注冊。注冊方法:點擊開始/運行/cmd,在命令行提示窗口下更改到Matlab安裝路徑/bin,運行指令
matlab/regserver,注冊成功後會彈出Matlab 命令窗口。

9. matlab與C++混合編程(高手請進)

源代碼:
#include "D:\extern\include\mat.h"

void main() {
MATFile *pMF; // mat文件
mxArray *pA; // 矩陣指針
double *A; // 數據指針
int i, j;
// 打開一個test.mat文件,只寫,如果不存在就新建,否則刪除重建
pMF = matOpen("test.mat", "w");
// 新建一個12*4的矩陣只有實部(在MATLAB里矩陣都是復矩陣)
pA = mxCreateDoubleMatrix(12, 4, mxREAL);
// 給這個矩陣命名為x
mxSetName(pA, "x");
// 讓指針Array指向這個矩陣的數據
A = mxGetPr(pA);
// 在VC里數組是按行排放的,在MATLAB里矩陣是按列排放的,)
for (i = 0; i < 12; i++)
for (j = 0; j < 4; j++)
A[j * 12 + i] = i + 0.001 * j;
// 將矩陣寫到文件test內
matPutArray(pMF, pA);
// 釋放矩陣空間
mxDestroyArray(pA);
// 關閉文件
matClose(pMF);
}

熱點內容
伺服器1u能連接幾台電腦 發布:2025-02-07 18:50:02 瀏覽:152
立人編譯 發布:2025-02-07 18:48:32 瀏覽:763
日產途達四驅的有哪些配置 發布:2025-02-07 18:42:02 瀏覽:831
伺服器搭建鏡像站 發布:2025-02-07 18:41:55 瀏覽:376
游戲上雲成標配雲伺服器該怎麼選 發布:2025-02-07 18:26:13 瀏覽:141
哪個安卓手機自帶系統沒有廣告 發布:2025-02-07 18:22:36 瀏覽:724
電腦開機後一直在配置更新怎麼進入系統 發布:2025-02-07 18:17:43 瀏覽:12
新浪上傳視頻在哪 發布:2025-02-07 18:17:38 瀏覽:558
外匯點差演算法 發布:2025-02-07 18:16:41 瀏覽:81
我的世界各種伺服器核心的區別 發布:2025-02-07 18:15:52 瀏覽:678