在C ++中使用matio时Mat_Open不起作用

时间:2016-10-18 10:14:13

标签: c++ matlab matio

我正在使用matio库将std::vector<std::vector<std::vector<double>>>和其他一些数据的内容写入MatLab文件。我在这里使用了一个教程:http://na-wiki.csc.kth.se/mediawiki/index.php/MatIO

但是,Mat_Open保留NULL,这意味着我无法在文件中写入任何内容。没有错误消息,链接/编译没问题,永远不会打印Saving mat file,程序的退出代码为0。我错过了一些明显的东西吗?

应该创建MatLab文件的函数的内容:

mat_t *mat;
matvar_t *matvar;
unsigned long dims[3] = {100, 100, 3};
unsigned long single_dim[1] = {1};
unsigned long size = 100;
double number = 3.14;

mat = Mat_Open("/home/ruben/data.mat", MAT_ACC_RDWR);

if(mat != NULL) {
    std::cout << "Saving mat file" << std::endl;
    matvar = Mat_VarCreate("matrix", MAT_C_DOUBLE, MAT_T_DOUBLE, 3, dims, matrix, 0);
    Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
    Mat_VarFree(matvar);

    matvar = Mat_VarCreate("number", MAT_C_DOUBLE, MAT_T_DOUBLE, 1, single_dim, &number, 0);
    Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
    Mat_VarFree(matvar);

    Mat_Close(mat);
}

我使用#include <matio.h>添加了库,并将其与-std=c++11 -L/usr/lib -lmatio -lz相关联。任何帮助表示赞赏。

编辑:我在GitHub上找到了这个项目,将其作为一个问题提交:https://github.com/tbeu/matio/issues/45

1 个答案:

答案 0 :(得分:0)

在项目作者的帮助下,我自己找到了解决方案。 有两件事出了问题:

  1. 如果MatLab文件尚不存在,则应使用Mat_CreateMat_CreateVer
  2. std::vector个元素不能简单地用作Mat_VarCreate函数的参数。应该传递指向第一个元素的指针。
  3. 更新了工作代码:

    mat_t *mat;
    matvar_t *matvar;
    unsigned long dims[3] = {100, 100, 3};
    unsigned long single_dim[1] = {1};
    unsigned long size = 100;
    double number = 3.14;
    
    mat = Mat_Create("/home/ruben/data.mat", NULL);
    
    if(mat != NULL) {
        std::cout << "Saving mat file" << std::endl;
        matvar = Mat_VarCreate("matrix", MAT_C_DOUBLE, MAT_T_DOUBLE, 3, dims, &matrix->at(0), 0);
        Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
        Mat_VarFree(matvar);
    
        matvar = Mat_VarCreate("number", MAT_C_DOUBLE, MAT_T_DOUBLE, 1, single_dim, &number, 0);
        Mat_VarWrite(mat, matvar, MAT_COMPRESSION_ZLIB);
        Mat_VarFree(matvar);
    
        Mat_Close(mat);
    }
    

    希望这对某人有用。