Ich versuche zu lernen, wie die C-API .mat
Dateien zu lesen Matlab zu verwenden, aber es funktioniert nicht wie ich erwartet hatte:Lesen von Daten aus Matlab Dateien in C
Ich möchte eine einfach öffnen, sehr einfach .mat
Datei namens test.mat
, lesen Sie einen Wert aus der Datei und speichern Sie es in einer C-Variablen. Ich habe test.mat
in Matlab mit den folgenden Befehlen erstellt:
> value = 3;
> save ("test.mat", "value")
Unter meinem C-Code ist, der nicht einmal kompilieren - der Compiler scheint nicht die Header-Dateien zu finden. Siehe unten den Code für 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
(der -I-Flag mit der Linie CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/
in meiner Make-Datei angegeben ist, und ich habe, dass das Verzeichnis überprüft existiert und enthält die Header-Dateien mat.h
und matrix.h
).
UPDATE:
ich gefunden habe, dass die Bibliotheken Ich brauche in zu verknüpfen sind libmat.so
und libmx.so
(nach this MathWorks help article), in /usr/local/MATLAB/R2011a/bin/glnxa64/
auf meinem System befindet. Ich habe deshalb meine Make-Datei zu dieser Aktualisierung:
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
Allerdings habe ich immer noch die gleichen Fehler:
CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx
Nun make
gibt den folgenden Befehl ausführen. Irgendwelche Ideen?
OK.Ich habe gefunden, wo die * .so residieren ('/ usr/local/MATLAB/R2011a/bin/glnxa64 /') und ich denke, ich [herausgefunden, wie die Bibliotheken heißen] (http://www.mathworks.se /help/techdoc/matlab_external/f19027.html) ('libmat.so' und' libmx.so'). Ich kann jedoch immer noch nicht kompilieren (bekomme die gleichen Fehler wie zuvor). Ich habe meine Antwort mit einigen Details zu den Änderungen aktualisiert, die ich vorgenommen habe. –
@TomasLycken, es gibt kein Update auf Ihre Frage. Basierend auf dem, was Sie gesagt haben, habe ich meine Antwort aktualisiert. – hmjd
Entschuldigung - Ich schrieb den Kommentar, begann mit dem Schreiben des Updates und vergaß, auf "Speichern" zu klicken: P Jetzt ist es da. Es scheint, dass es tut, was Sie vorschlagen, aber es funktioniert immer noch nicht ... –