2012-08-30 10 views
7

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?

Respuesta

6

Esto es un error del enlazador, no un error del compilador (y no está relacionado con la opción del compilador -I). Debe especificar el directorio en el que se encuentran los archivos matlab .so utilizando el indicador -L y agregar una opción -l<matlab-lib-name> al final del comando del compilador que especifica el nombre de la biblioteca de matlab.

Por ejemplo:

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

(no sé el directorio exacto en el cual se encuentran .so o el nombre de la biblioteca de Matlab)


basa en la c omment proporcionar más información:

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

+0

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

+0

@TomasLycken, no hay una actualización para su pregunta. Basado en lo que has dicho, he actualizado mi respuesta. – hmjd

+0

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

Cuestiones relacionadas