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?
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. –
@TomasLycken, nie ma aktualizacji Twojego pytania. Na podstawie tego, co powiedziałeś, zaktualizowałem swoją odpowiedź. – hmjd
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 ... –