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?
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. –
@TomasLycken, non vi è alcun aggiornamento alla tua domanda. In base a ciò che hai detto, ho aggiornato la mia risposta. – hmjd
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 ... –