将数据从matlab文件读入C语言

Tom*_*han 8 c matlab

我正在尝试学习如何使用C API来读取Matlab .mat文件,但它没有像我预期的那样工作:

我想打开一个非常简单的.mat文件test.mat,从文件中读取一个值并将其存储在C变量中.我test.mat使用以下命令在Matlab中创建:

> value = 3;
> save ("test.mat", "value")
Run Code Online (Sandbox Code Playgroud)

下面是我的C代码,它甚至没有编译 - 编译器似乎没有找到头文件.请参阅下面的编译器输出代码.我在这做错了什么?

码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

编译器输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

(-I标志与行指定CPPFLAGS=-I/usr/local/MATLAB/R2011a/extern/include/在我的makefile文件,并且我已经验证该目录存在并包含头文件mat.hmatrix.h).

更新:
我发现我需要链接的库libmat.solibmx.so(根据本MathWorks的帮助文章),居住在/usr/local/MATLAB/R2011a/bin/glnxa64/我的系统上.因此我将makefile更新为:

CPPFLAGS =-I/usr/local/MATLAB/R2011a/extern/include/
LDFLAGS = -L/usr/local/MATLAB/R2011a/bin/glnxa64 -l mat -l mx
Run Code Online (Sandbox Code Playgroud)

现在,running make提供以下命令:

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
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到同样的错误.有任何想法吗?

hmj*_*mjd 7

这是链接器故障,而不是编译器故障(与-I编译器选项无关).您需要.so使用-Lflag 指定matlab 文件所在的目录,并在-l<matlab-lib-name>编译器命令的末尾添加一个选项,用于指定matlab库的名称.

例如:

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

(我不知道.so所在的确切目录或matlab库的名称)


根据提供进一步信息的评论:

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