Ich versuche zu lernen, wie man die C-API zum Lesen von Matlab verwendet .mat
Dateien, aber es funktioniert nicht so, wie ich es erwartet habe:
Ich möchte nur eine sehr einfache .mat
Datei namens test.mat
lesen Sie einen Wert aus der Datei und speichern ihn in einer C-Variablen. Ich habe erstellt test.mat
in Matlab mit den folgenden Befehlen:
> value = 3;
> save ("test.mat", "value")
Unten ist mein C-Code, der sich nicht einmal kompilieren lässt - der Compiler scheint die Header-Dateien nicht zu finden. Siehe unter dem Code die Compilerausgabe. Was mache ich hier falsch?
Code:
#include <stdlib.h>
#include <stdio.h>
#include <mat.h>
#include <matrix.h>
int main(int argc, char *argv[]) {
double value;
MATFile *datafile;
datafile = matOpen("test.mat", "r");
mxArray *mxValue;
mxValue = matGetVariable(datafile, "value");
matClose(datafile);
value = *mxGetPr(mxArray);
mxFree(mxArray);
printf("The value fetched from the .mat file was: %f", value);
return 0;
}
Compiler-Ausgabe:
$ make animate_shot
cc -I/usr/local/MATLAB/R2011a/extern/include/ animate_shot.c -o animate_shot
/tmp/cczrh1vT.o: In function `main':
animate_shot.c:(.text+0x1a): undefined reference to `matOpen'
animate_shot.c:(.text+0x2f): undefined reference to `matGetVariable'
animate_shot.c:(.text+0x3f): undefined reference to `matClose'
animate_shot.c:(.text+0x4b): undefined reference to `mxGetPr'
animate_shot.c:(.text+0x5e): undefined reference to `mxFree'
collect2: ld returned 1 exit status
make: *** [animate_shot] Error 1
(das Flag -I wird mit der Zeile CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/
in meinem Makefile, und ich habe überprüft, dass das Verzeichnis existiert und die Header-Dateien enthält mat.h
y matrix.h
).
UPDATE:
Ich habe festgestellt, dass die Bibliotheken, die ich einbinden muss, folgende sind libmat.so
y libmx.so
(laut dieser MathWorks-Hilfeartikel ), wohnhaft in /usr/local/MATLAB/R2011a/bin/glnxa64/
auf meinem System. Ich habe daher mein Makefile auf diese Weise aktualisiert:
CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx
Jetzt läuft make
ergibt den folgenden Befehl:
cc -I/usr/local/MATLAB/R2011a/extern/include/ -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx animate_shot.c -o animate_shot
Ich erhalte jedoch immer noch die gleichen Fehler. Irgendwelche Ideen?