8 Stimmen

Lesen von Daten aus Matlab-Dateien in C

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?

7voto

hmjd Punkte 118293

Dies ist ein Fehler des Linkers, nicht des Compilers (und hat nichts mit der -I Compiler-Option). Sie müssen das Verzeichnis angeben, in dem die matlab .so Dateien werden mit -L Flagge und fügen eine -l<matlab-lib-name> Option am Ende des Compiler-Befehls, 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 kenne weder das genaue Verzeichnis, in dem sich die .so-Dateien befinden, noch den Namen der Matlab-Bibliothek)


Auf der Grundlage des Kommentars mit weiteren Informationen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X