2012-08-30 10 views
7

Próbuję dowiedzieć się, jak korzystać z C API do czytania MATLAB .mat plików, ale to nie działa jak się spodziewałem:odczyt danych z plików matlab język C

Chciałbym po prostu otworzyć bardzo prosta .mat plik o nazwie test.mat, odczytaj wartość z pliku i zapisz ją w zmiennej C. Utworzyłem test.mat w Matlab przy użyciu następujących poleceń:

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

Poniżej jest moje kod C, która nawet nie skompilować - kompilator nie wydaje się, aby znaleźć pliki nagłówkowe. Zobacz poniżej kod dla wyjścia kompilatora. Co ja tu robię źle?

Kod:

#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 wyjściowa:

$ 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 

(Flaga -i jest określona z linii CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/ w moim makefile, a ja sprawdzeniu, że w katalogu istnieje i zawiera pliki nagłówkowe mat.h i matrix.h).

UPDATE:
Znalazłem że biblioteki muszę połączyć w to libmat.so i libmx.so (według this MathWorks help article), zamieszkały w /usr/local/MATLAB/R2011a/bin/glnxa64/ w moim systemie. Mam w związku z tym zaktualizowany mój makefile do tego:

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

Teraz działa make daje następujące polecenie:

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 

Ja jednak wciąż te same błędy. Jakieś pomysły?

Odpowiedz

6

Jest to błąd łącznika, a nie błąd kompilatora (i nie jest związany z opcją kompilatora -I). Musisz określić katalog, w którym znajdują się pliki matlab .so za pomocą flagi -L i dodać opcję -l<matlab-lib-name>, aby zakończyć komendę kompilatora, która określa nazwę biblioteki matlab.

Na przykład:

ml -I/usr/lokalnym/Matlab/R2011a/zewnętrzny/to/-L/usr/lokalnym/Matlab/R2011a/lib animate_shot.c -o animate_shot -lmatlab

(nie wiem dokładnie katalog do którego .so Znajdujemy lub nazwa biblioteki Matlab)


oparciu o C omment zapewniając Dalsze informacje:

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.Znalazłem, gdzie * .so rezyduje ('/ usr/local/MATLAB/R2011a/bin/glnxa64 /') i myślę, że [zorientowałem się, jak nazywa się biblioteki] (http://www.mathworks.se /help/techdoc/matlab_external/f19027.html) ('libmat.so' i' libmx.so'). Jednak nadal nie mogę się skompilować (otrzymuję takie same błędy jak wcześniej). Zaktualizowałem swoją odpowiedź, podając szczegóły dotyczące zmian, które wprowadziłem. –

+0

@TomasLycken, nie ma aktualizacji Twojego pytania. Na podstawie tego, co powiedziałeś, zaktualizowałem swoją odpowiedź. – hmjd

+0

Przepraszamy - napisałem komentarz, zacząłem pisać aktualizację i zapomniałem kliknąć "zapisz": P Teraz jest. Wygląda na to, że robi to, co sugerujesz, ale nadal nie działa ... –