Erzeugen von Mex-Files
Hinweis: Für die Nutzung von Matlab-Femset sind die Informationen auf dieser Seite nicht erforderlich. Sie sind ausschließlich für Interessenten gedacht, die selbst Mex-Files erzeugen wollen.

Was sind Mex-Files?

Mex-Files sind die Interface-Routinen zwischen Matlab-Scripts und C-Funktionen (bzw. FORTRAN-Subroutinen, hier wird nur das Interface zu C betrachtet). Grundsätzlich können C-Funktionen (trotz ähnlicher Syntax) nicht direkt aus Matlab-Scripts aufgerufen werden.

Ein Mex-File ist eine in der Programmiersprache C geschriebene Funktion, die einige spezielle Konventionen einhalten und aus Matlab heraus (mit der Anweisung "mex") compiliert werden muss. Sie wird in der Regel nicht den gesamten Algorithmus, der abgearbeitet werden soll, selbst enthalten. Es können beliebige weitere C-Funktionen aufgerufen werden, die beim Compilierungsprozess auch über eine statische Bibliothek (.lib-Datei) eingebunden werden können.

Das folgende "Gerüst" ist für alle Mex-Files zwingend vorgeschrieben:

#include  "mex.h"

void mexFunction (int nlhs , mxArray *plhs[], int nrhs , const mxArray *prhs[])
{
   /* Hier wird der zu erledigende Algorithmus eingebaut:

}

Beispiel für das Zusammenspiel Matlab ↔ Mex-File

Zu Matlab-Femset gehört zum Beispiel ein Mex-File cholba_m für die Cholesky-Zerlegung einer symmetrischen Bandmatrix. Von den verschiedenen Aufruf-Varianten zeigt der folgende Bildschirm-Schnappschuss die einfachste:

In den Zeilen 1 bis 6 wird eine Matrix aufgebaut, für die von dem in Zeile 8 aufgerufenen Mex-File die Cholesky-Zerlegung ausgeführt wird. Im rechts zu sehenden Command Window sieht man die abgelieferten Ergebnisse.

Aus dem Quellcode des Mex-Files cholba_m.c werden nachfolgend einige Zeilen kommentiert:

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

  /* ... */

  /* Die Anzahl der angelieferten Parameter ist bei dem oben dargestellten Aufruf gleich 1,
     diese Mindestanzahl wird ueberprueft: */
  if(nrhs < 1) mexErrMsgTxt("Eingabewerte fuer cholba_m fehlen.") ;

  /* Es gibt also einen "mx"-Pointer prhs[0], der auf die Matlab-Daten (in diesem Fall eine Matrix)
     zeigt. Auf diese Daten kann nur ueber die "mx"-Funktionen zugegriffen werden:  */
  ma = mxGetM (prhs[0]) ;
  na = mxGetN (prhs[0]) ;    /* ... liefern Zeilen- bzw. Spaltenanzahl der Matrix */

  /* ... */

  /* Der "mx"-Pointer prhs[0] zeigt auf eine "mxArray-Struktur". Mit der "mx"-Funktion mxGetPr
     erhaelt man einen "normalen" C-Pointer auf die Eingabematrix: */
  a_p = mxGetPr(prhs[0]) ;

  /* Mit ma und na und dem Pointer a_p auf die Matrix A stehen nun alle erforderlichen Informationen
     als "normale" C-Variablen zur Verfuegung, nun folgt also "normale" C-Programmierung (u. a.
     Berechnung der Cholesky-Zerlegung der Eingabematrix mit einer C-Funktion aus einer statischen
     Library) ... */

  /* ... */

  /* Zum Schluss aber müssen die "normalen" C-Variablen fuer die Rueckgabe an den Matlab-Aufruf
     wieder zu "mx"-Pointern konvertiert werden. Dies erledigt die Funktion mxCreateDoubleMatrix.
     Fuer die einfache Variable ipode, die im Verlauf der Rechnung erzeugt wurde und als erster
     Wert (der beiden Rueckgabewerte) an den Aufruf aus Matlab zurueckgegeben werden soll, wird
     ein "mx"-Pointer auf eine "1x1-Matrix" erzeugt, auf den ueber mxGetPr zugegriffen werden
     kann, so dass dem Speicherplatz, auf den der "C-Pointer" zeigt, der zu uebergebende Wert
     zugewiesen werden kann: */

  plhs[0]= mxCreateDoubleMatrix (1 , 1 , mxREAL) ;
  *mxGetPr(plhs[0]) = ipode ;
}

Bevor Mex-Files aus Matlab (wie im Bildschirm-Schnappschuss oben gezeigt) aufgerufen werden können, müssen sie (aus Matlab heraus mit der Anweisung mex) compiliert werden. Voraussetzungen dafür sind:

Für das hier behandelte Beispiel sind alle aus cholba_m.c heraus aufgerufenen Funktionen in den statischen Libraries femset_f.lib und femtnw_f.lib verfügbar (für die 64-Bit-Version von Matlab sind es die Libraries femset64.lib und femtnw64.lib), so dass die Compilierung aus dem Matlab-Command-Window heraus mit folgender Anweisung erfolgen kann (32-Bit-Version):

mex cholba_m.c femset_f.lib femtnw_f.lib

Für die 64-Bit-Version lautet die Anweisung:

mex cholba_m.c femset64.lib femtnw64.lib

Diese 3 Dateien (cholba_m.c, femset_f.lib und femtnw_f.lib bzw. femset64.lib und femtnw64.lib) müssen von Matlab aus gefunden werden (sollten sich z. B. im "Current Directoy" befinden), zusätzlich noch die Header-Datei femset_f.h, die von cholba_m.c eingebunden wird. Es entstehen die Dateien cholba_m.dll (32-Bit-Version) bzw. cholba_m.mexw64 (64-Bit-Version), die (wie oben gezeigt) aus Matlab-Scripts aufgerufen werden können. Man kann dies mit der eigenen Matlab-Version nachvollziehen, weil alle benötigten Dateien zum Download verfügbar sind (man muss allerdings einmal vorab den nachfolgend beschriebenen Setup-Vorgang durchgeführt haben. Wenn man die compilierte Mex-Datei cholba_m.dll bzw. cholba_m.mexw64 erzeugt hat, kann man sie mit dem oben vorgestellten kleinen Matlab-Script testen, das ebenfalls (als cholbatest.m) zum Download verfügbar ist.

Setup des Mex-Compilers

Für das Compileren eines Mex-Files muss dem Befehl mex ein C-Compiler zur Verfügung stehen. Dafür muss (einmalig) ein Setup ausgeführt werden, bei dem der gewünschte C-Compiler zugeordnet wird. Zu älteren (32-Bit-)Matlab-Versionen gehörte ein C-Compiler, der dafür verwendet werden konnte. Es war aber immer eine gute Idee, im Setup dem mex-Befehl den C-Compiler zuzuweisen, der auch für die Compilierung der C-Dateien verwendet wurde, die vom Mex-File aufgerufen werden (und zum Beispiel in statischen Libraries zusammengefasst wurden).

Setup für ältere (32-Bit-)Versionen mit eigenem C-Compiler

Der folgende Bildschirm-Schnappschuss zeigt den Dialog, der im Command Window von Matlab durch den mex-Setup-Befehl ausgelöst wird. Es wird die angebotene Option gewählt, nach installierten Compilern zu suchen. Hier wird neben dem Matlab-C-Compiler lcc noch ein MS-Visual-C/C++-Compiler gefunden, der schließlich ausgewählt wird:

Setup für 64-Bit-Versionen

Der folgende Bildschirm-Schnappschuss zeigt den Dialog, der im Command Window von Matlab (64-Bit-Version) durch den mex-Setup-Befehl ausgelöst wird. Es wird auch hier die angebotene Option gewählt, nach installierten Compilern zu suchen. Weil diese Matlab-Version keinen eigenen C-Compiler hat, wird nur ein MS-Visual-C++-2010-Express-Compiler gefunden, der zwangsläufig ausgewählt wird. Es ist genau der Compiler, der in der html-Datei empfohlen wird, auf die im Dialog hingewiesen wird. Dort findet man auch einen Hinweis, wo man ihn beziehen kann. Man beachte die zusätzlich ausgegebenen Hinweise und Warnungen: