estoy tratando de aprender cómo utilizar la API de C para la lectura de archivos de Matlab .mat
, pero que no funciona como esperaba:La lectura de datos a partir de archivos de MATLAB en C
me gustaría simplemente abrir una manera muy sencilla .mat
archivo llamado test.mat
, lea un valor del archivo y guárdelo en una variable C. He creado test.mat
en Matlab usando los siguientes comandos:
> value = 3;
> save ("test.mat", "value")
A continuación se muestra el código C, que ni siquiera compilar - no parece que el compilador para encontrar los archivos de cabecera. Vea a continuación el código para la salida del compilador. ¿Qué estoy haciendo mal aquí?
Código:
#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;
}
compilador de salida:
$ 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
(la bandera -I se especifica con la línea CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/
en mi makefile, y he verificado que el directorio existe y contiene los archivos de encabezado mat.h
y matrix.h
).
ACTUALIZACIÓN:
he descubierto que las bibliotecas que necesito para enlazar en son libmat.so
y libmx.so
(según this MathWorks help article), con domicilio en /usr/local/MATLAB/R2011a/bin/glnxa64/
en mi sistema. Por lo tanto, he actualizado mi makefile a esto:
CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx
Ahora, corriendo make
da el siguiente 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
Sin embargo, sigo teniendo los mismos errores. ¿Algunas ideas?
OK.He encontrado dónde residen * .so ('/ usr/local/MATLAB/R2011a/bin/glnxa64 /') y creo que [descubrí cómo se llaman las bibliotecas] (http://www.mathworks.se) /help/techdoc/matlab_external/f19027.html) ('libmat.so' y' libmx.so'). Sin embargo, todavía no puedo compilar (obteniendo los mismos errores que antes). He actualizado mi respuesta con algunos detalles sobre los cambios que he realizado. –
@TomasLycken, no hay una actualización para su pregunta. Basado en lo que has dicho, he actualizado mi respuesta. – hmjd
Lo siento, escribí el comentario, comencé a escribir la actualización y olvidé hacer clic en "guardar": P Ahora está allí. Parece que está haciendo lo que sugieres, pero todavía no funciona ... –