2012-08-30 19 views
7

sto cercando di imparare a utilizzare l'API C per la lettura di Matlab .mat file, ma non funziona come mi aspettavo:lettura dei dati da file di MATLAB in C

Mi piacerebbe aprire solo una molto semplice Il file .mat chiamato test.mat, legge un valore dal file e lo memorizza in una variabile C. Ho creato test.mat in Matlab utilizzando i seguenti comandi:

> value = 3; 
> save ("test.mat", "value") 

Qui di seguito è il mio codice C, che non ha nemmeno compilare - il compilatore non sembra trovare i file di intestazione. Vedi sotto il codice per l'output del compilatore. Cosa sto facendo di sbagliato qui?

Codice:

#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 uscita:

$ 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 

(viene specificato il flag -I con la linea CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/ nel mio makefile, e ho verificato che la directory esiste e contiene i file di intestazione mat.h e matrix.h).

UPDATE:
ho trovato che le librerie ho bisogno di collegare in sono libmat.so e libmx.so (secondo this MathWorks help article), residente in /usr/local/MATLAB/R2011a/bin/glnxa64/ sul mio sistema. Ho quindi aggiornato il mio makefile a questo:

CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/ 
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx 

Ora, in esecuzione make ha pronunciato la seguente comando:

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 

Tuttavia, ho ancora gli stessi errori. Qualche idea?

risposta

6

Questo è un errore del linker, non un errore del compilatore (ed è indipendente dall'opzione del compilatore -I). È necessario specificare la directory in cui si trovano i file MATLAB .so utilizzando il flag -L e aggiungere un'opzione -l<matlab-lib-name> alla fine del comando del compilatore che specifica il nome della libreria MATLAB.

Ad esempio:

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

(non so la directory esatto nel quale si trovano .so oppure il nome della libreria mATLAB)


Basato sul c omment fornire ulteriori informazioni:

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.Ho trovato dove risiede * .so ('/ usr/local/MATLAB/R2011a/bin/glnxa64 /') e penso di aver capito quali sono le librerie chiamate (http://www.mathworks.se /help/techdoc/matlab_external/f19027.html) ('libmat.so' e' libmx.so'). Tuttavia, non riesco ancora a compilare (ottenendo gli stessi errori di prima). Ho aggiornato la mia risposta con alcuni dettagli sui cambiamenti che ho apportato. –

+0

@TomasLycken, non vi è alcun aggiornamento alla tua domanda. In base a ciò che hai detto, ho aggiornato la mia risposta. – hmjd

+0

Scusa - Ho scritto il commento, ho iniziato a scrivere l'aggiornamento e ho dimenticato di fare clic su "Salva": P Ora è lì. Sembra che stia facendo quello che stai suggerendo, ma non funziona ancora ... –