如何保存 c++ 可读的 .mat 文件
How to save a c++ readable .mat file
我在matlab中运行DCT代码,我想将压缩文件(.mat
)读入C代码。但是,我不确定这是否正确。我还没有完成我的代码,但我想请求解释如何从我的.mat
文件创建 c++ 可读文件。
当涉及到文件的.mat
,.txt
然后二进制,浮动细节时,我有点困惑。有人请向我解释一下。
似乎你在这里有很多选择,这取决于你的确切需求、时间和技能水平(在 Matlab 和 C++ 中)。 显而易见的是:
ASCII 文件
您可以使用 save(filename, variablename, '-ascii')
语法在 Matlab 中生成 ASCII 文件,也可以使用 c 样式的fprintf
命令创建更自定义的格式。 然后,在 C 或 C++ 程序中,使用 fscanf
读取文件。
这通常是最简单的,在许多情况下也足够好。 人类可以使用记事本++,emacs等读取文件的事实是一个很好的健全性检查(尽管这经常被高估)。
有两个很大的缺点。 首先,文件非常大(8 字节的双精度数需要大约 19 个字节才能存储在 ASCII 中)。 其次,您必须非常小心,以尽量减少不可避免的精度损失。
磁盘上的字节数
对于简单的数字数组(例如,32 x 32 的双精度数组),您只需使用 fwrite
Matlab 函数将数组写入磁盘即可。 然后在 C/C++ 中使用并行fread
函数。
这不会损失精度,速度非常快,磁盘上的尺寸相对较小。
这种方法的缺点是复杂的 Matlab 结构不一定能被保存。
Mathworks 提供的 C 库
由于这是一个非常普遍的问题,Mathworks实际上已经通过直接C实现读取/写入*.mat文件所需的函数来解决这个问题。 我没有使用过这个特定的库,但通常它们提供的库很容易集成。可以从这里找到一些文档:http://www.mathworks.com/help/matlab/read-and-write-matlab-mat-files-in-c-c-and-fortran.html
这应该是一个非常强大的解决方案,并且对变化相对不敏感,因为它是主流支持的 Matlab 工具集的一部分。
基于 HDF5 的 *.mat 文件
对于最新版本的 Matlab,您可以使用符号save(filename, variablename, '-v7.3');
强制 Matlab 以基于 HDF5 的格式保存文件。 然后,您可以使用 HDF5 组中的工具来处理该文件。 请注意一个体面的,基于Java的GUI查看器(http://www.hdfgroup.org/hdf-java-html/hdfview/index.html#download_hdfview)以及用于C,C++和Fortran的库。
这是一种存储二进制数据的非脆弱方法。 让库在您的代码中工作也需要一些工作。
一个缺点是Mathworks可能会改变它们如何将Matlab数据类型映射到HDF5文件的细节。 如果你真的想变得强大,你可能想尝试...
自定义 HDF5 文件
与其只采用Mathworks决定使用的任何格式,直接创建一个HDF5文件并从Matlab将数据推送到其中并不难。 这使您可以控制压缩、块大小调整、数据集层次结构和名称等内容。 它还使您免受默认 *.mat 文件格式的任何未来更改。 请参阅 Matlab 中的 h5write
命令。
从 C/C++ 端开始运行仍然有点费力,所以如果你的项目需要,我只会走这条路。
.mat
是MATLAB本身的特殊格式。您可以做的是在 MATLAB 工作区中加载.mat
文件:
load file.mat
然后使用 fopen
和 fprintf
将数据写入file.txt
然后可以在 C 中读取该文件的内容。
您还可以使用 matlab 的 dlmwrite 写入分隔的 asci 文件,该文件在 C 语言中很容易读取(并且人类也可以读取),尽管如果这是问题的核心,它可能没有那么压缩
除了已经提到的内容之外,您还可以使用 -ascii 从 MATLAB 保存数据。
save x.mat x
成为:
save x.txt x -ascii
- 如果函数使用 OPENCV Mat 作为输入,如何编写头文件?
- 将 matlab 数组(MAT-文件)转换为C++数组
- 犰狳读取MAT文件错误
- 将行附加到Armadillo .mat文件
- 从 MAT 文件中读取 C 应用程序中的自定义类
- 计算 OpenCV 中两个 Mat 文件的相关性
- C ++保存mat文件,构建日志显示"undefined reference to 'H5Tget_member_type'....................."
- 正在从C++中的.mat文件中读取变量
- 在OpenCV中将.mat文件从MATLAB转换为cv::mat矩阵
- 在 Matlab .mat 文件中读取:变量的秩和变暗正确,但数据为 NULL
- 通过 MatIO 读取 Visual c++ 中的 mat 文件的数据
- matPutVariable:尝试将数据输出到mat文件时出错(matrix::serialize::WrongSize
- 使用STL容器从c++中读取.mat文件的Matlab API
- 使用C++从MAT文件导入三维阵列
- 使用Matio库将.mat文件中的字符串读取到C++中
- 读取MatLab (mat)文件与VNL
- 从c++中循环写入.mat文件
- 将.mat文件中的值输入到C++中的数组中
- 如何保存 c++ 可读的 .mat 文件
- 写入MAT文件:508次呼叫成功后访问违规写入位置