2012-08-30 15 views
7

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?

Antwort

6

Dies ist ein Linker-Fehler, kein Compiler-Fehler (und hat keinen Bezug zu -I Compiler-Option). Sie müssen das Verzeichnis angeben, in dem sich die Matlab-Dateien .so befinden, indem Sie das Flag -L verwenden und eine -l<matlab-lib-name>-Option zum Ende des Compilerbefehls hinzufügen, die den Namen der Matlab-Bibliothek angibt.

Zum Beispiel:

cc -I/usr/local/MATLAB/R2011a/extern/include/-L/usr/local/MATLAB/R2011a/lib animate_shot.c -o animate_shot -lmatlab

(ich weiß nicht, die genaue Verzeichnis, in das die .so befinden oder der Name der Matlab-Bibliothek)


auf der c Basierend omment eine weitere Informationen:

cc -I/usr/local/MATLAB/R2011a/extern/include/-L/usr/local/MATLAB/R2011a/bin/glnxa64 animate_shot.c -o animate_shot -lmat - lmx

+0

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. –

+0

@TomasLycken, es gibt kein Update auf Ihre Frage. Basierend auf dem, was Sie gesagt haben, habe ich meine Antwort aktualisiert. – hmjd

+0

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 ... –