MATLAB-Übung | MEX-Datei

Die Anwendungsschnittstelle ist eine Methode für MATLAB und andere Sprachen, um die Funktionen anderer Sprachen aufzurufen. Mit MEX-Dateien können MATLAB-Programme in anderen Sprachen geschriebene Funktionen aufrufen oder verknüpfen, und mit der MATLAB-Engine können MATLAB-Funktionen in anderen Sprachprogrammen aufgerufen werden.

01, MEXText


MEX ist die Abkürzung für MATLAB Executable und ist eine Schnittstelle in MATLAB, die zum Aufrufen von in anderen Sprachen geschriebenen Programmen verwendet wird. In anderen Sprachen geschriebene MEX-Programme werden kompiliert und in MEX-Dateien generiert, die als Erweiterungsfunktionen von MATLAB verwendet werden können. MEX-Dateien können in der MATLAB-Umgebung aufgerufen werden und ähneln in der Verwendung den MATLAB-Funktionen, MEX-Dateien haben jedoch Vorrang vor MATLAB-Funktionen. Im Folgenden wird C++ als Beispiel verwendet, um die Funktionen der MEX-Bibliothek, die Zusammensetzung des MEX-Quellprogramms, die Methoden zum Kompilieren des MEX-Quellprogramms und zum Aufrufen der MEX-Datei vorzustellen.

1. MEX-Funktion


MEX-Bibliotheksfunktionen werden verwendet, um Daten zwischen MEX-Programmen und der MATLAB-Umgebung auszutauschen und entsprechende Informationen aus dem MATLAB-Arbeitsbereich zu erhalten. Alle MEX-Funktionen werden in der Header-Datei mex.h im Unterordner extern\include von MATLAB deklariert. Tabelle 1 listet die häufig verwendeten MEX-Funktionen und Funktionen in der Sprache C/C++ auf.


■ Tabelle 1 Häufig verwendete MEX-Funktionen und Funktionen in der Sprache C/C++

2. Erstellung eines MEX-Dateiquellprogramms


Das MEX-Dateiquellprogramm besteht aus den folgenden zwei Teilen.
(1) Eingabeunterprogramm. Der Standardname des Eingabeunterprogramms lautet mexFunction. Seine Funktion besteht darin, eine Verbindung zwischen dem MATLAB-System und dem aufgerufenen externen Unterprogramm herzustellen und die Eingabeadresse des von MATLAB aufgerufenen externen Unterprogramms sowie die vom MATLAB-System und dem Unterprogramm übergebenen Parameter zu definieren , usw. Das Definitionsformat der Eingabeunterroutine lautet wie folgt: 

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
}

 Das Eingabeunterprogramm hat 4 Parameter. nlhs definiert die Anzahl der Ausgabeergebnisse, plhs zeigt auf die Variable, die zur Rückgabe der Ausgabeergebnisse verwendet wird, nrhs definiert die Anzahl der Eingabeparameter und prhs zeigt auf die Variable, die die Eingabeparameter speichert. prhs und plhs sind Zeiger auf mxArray-Objekte. C++-Programme müssen mxArray-Objekte verwenden, um Daten mit dem MATLAB-Arbeitsbereich auszutauschen. Die Werte jedes Elements des Objekts sind standardmäßig vom Typ double.
(2) Berechnungsunterprogramm. Das Berechnungsunterprogramm umfasst alle Programme, die Berechnungsfunktionen ausführen und wird vom Eingabeunterprogramm aufgerufen. Das Definitionsformat von Berechnungsunterprogrammen ist das gleiche wie das anderer C/C++-Unterprogramme.
Die Header-Datei mex.h enthält alle MEX-Funktionsdeklarationen, daher müssen Makrobefehle am Anfang der Datei hinzugefügt werden:

#include "mex.h"

 Im Folgenden wird anhand eines Beispiels der grundsätzliche Aufbau der MEX-Datei veranschaulicht.
[Beispiel 1] Verwenden Sie C++, um ein MEX-Datei-Quellprogramm zu schreiben, um das kleinste gemeinsame Vielfache zweier Zahlen zu finden, und kompilieren Sie es, um eine MEX-Datei zu generieren. Rufen Sie diese MEX-Datei auf, um das kleinste gemeinsame Vielfache zweier Ganzzahlen zu finden.
Der Ablauf ist wie folgt:

# include "mex.h"
//求最小公倍数子程序
double com_multi(double *x,double *y){
int a, b, c, d; a = int(*x); b= int(*y); c=a>=b?a:b; d=c;
while (c%a!=0 || c%b!=0)
c=c+d; return c;
//入口子程序
void mexFunction( int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[]){
double *result; int m,n, i;
//检查参数数目是否正确 if(nrhs!= 2) {
mexErrMsgTxt("输入参数应有两个!");return;
}
if(nlhs!= 1) {
mexErrMsgTxt("应有一个输出参数!");return;
//检查输入参数的类型 for(i= 0;i<2;i++){
m= int(mxGetM(prhs[i])); n = int(mxGetN(prhs[i]));
if( mxIsClass(prhs[i],"int") || !(m ==1 &&n==1)){
mexErrMsgTxt("输入参数必须是一个数.");
}
}
//准备输出空间
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); result= mxGetPr(plhs[0]);//计算
*result= com_multi(mxGetPr(prhs[0]),mxGetPr(prhs[1]));

 Speichern Sie das obige Programm im aktuellen Ordner mit dem Dateinamen TryMex.cpp.


3. Kompilierung des MEX-Dateiquellprogramms


Für die Kompilierung des MEX-Dateiquellprogramms sind zwei Bedingungen erforderlich: Zum einen müssen die MATLAB-Anwendungsprogrammschnittstellenkomponente und die entsprechenden Tools installiert sein, zum anderen ist ein geeigneter C/C++-Sprachcompiler erforderlich.
Es gibt zwei Methoden zum Kompilieren von MEX-Dateiquellprogrammen: Eine besteht darin, den von MATLAB bereitgestellten Compiler zu verwenden, und die andere darin, andere Kompilierungstools wie Microsoft Visual Studio zu verwenden. Wenn Sie den von MATLAB bereitgestellten Compiler verwenden, kompilieren Sie das MEX-Quellprogramm mit dem Befehl mex. Um beispielsweise das MEX-Quellprogramm von Beispiel 1 zu kompilieren, geben Sie den folgenden Befehl in das MATLAB-Befehlszeilenfenster ein:

>> mex TryMex.cpp

Das System verwendet den Standard-Compiler zum Kompilieren des Quellprogramms. Wenn die Kompilierung erfolgreich ist, wird im aktuellen Ordner eine MEX-Datei TryMex.mexw64 mit demselben Namen wie das Quellprogramm generiert. Die Erweiterung .mexw64 gibt an, dass die generierte MEX-Datei unter einem 64-Bit-Windows-System ausgeführt werden kann.
Die Methode zum Aufrufen der MEX-Datei ist die gleiche wie die Methode zum Aufrufen der M-Funktion. Geben Sie beispielsweise den folgenden Befehl in das MATLAB-Befehlszeilenfenster ein, um die obige MEX-Datei zu testen:

>> z = TryMex(8,34)
z = 136

Guess you like

Origin blog.csdn.net/qq_41640218/article/details/134597438