使用VNL读取MatLab(mat)文件

时间:2015-10-26 12:08:34

标签: c++ mat-file

我已经获得.mat个文件(三维,单精度浮点),我想用VXL阅读。 VNL有一些类/功能可以执行此操作,但我没有找到任何证明其用途的示例。我从the header file拼凑了以下内容,但似乎没有数据被读入,当我要求维度时,我得到的似乎是未初始化的垃圾(尽管读取了标题中的一些数据) )。

#include <vcl_cstdlib.h>
#include <vcl_iostream.h>
#include <vcl_fstream.h>
#include <vnl/vnl_matlab_read.h>
#include <vnl/vnl_vector.h>

int main(int argc, char ** argv)
{

  if (2 != argc)
    {
    std::cerr << "Provide a file." << std::endl;
    return EXIT_FAILURE;
    }

  const char * fileName = argv[1];

  vcl_filebuf fileBuffer;
  if (!fileBuffer.open(fileName,vcl_ios::in))
    {
    std::cerr << "There was a problem opening the file." << std::endl;
    return EXIT_FAILURE;
    }

  vcl_istream stream(&fileBuffer);
  vnl_matlab_readhdr read(stream);

  vcl_cout << read.name() << vcl_endl; // Platform: PCWIN64, Created on: (date and time)
  vcl_cout << read.rows() << vcl_endl; // 1094852661
  vcl_cout << read.cols() << vcl_endl; // 774905933

  vnl_vector<float> data;
  vnl_matlab_read_or_die(stream, data, fileName);
  std::cout << data.size() << std::endl; // 0

  return EXIT_SUCCESS;

}

我无法判断我是否错误地使用了该类,或者VNL是否可以处理多维数组?

1 个答案:

答案 0 :(得分:1)

并非所有MAT文件都使用相同的格式,它已被多次更改。阅读垃圾可能是尝试使用不支持压缩的库来读取压缩的MAT-File。

由于我无法找到您选择的库的任何合理文档,我只能推荐替代方案。在matlab中保存MAT-File时,请指定最新的格式-v7.3。这样做,Matlab将编写一个gzip压缩HDF5文件,该文件附带an API for C++

如果您无法访问Matlab,请使用Octave将您的Mat-Files转换为最新格式。此处save函数的选项称为-hdf5,而不是-7.3