如何保存 c++ 可读的 .mat 文件

How to save a c++ readable .mat file

本文关键字:mat 文件 c++ 何保存 保存      更新时间:2023-10-16

我在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

然后使用 fopenfprintf 将数据写入file.txt然后可以在 C 中读取该文件的内容。

您还可以使用 matlab 的 dlmwrite 写入分隔的 asci 文件,该文件在 C 语言中很容易读取(并且人类也可以读取),尽管如果这是问题的核心,它可能没有那么压缩

除了已经提到的内容之外,您还可以使用 -ascii 从 MATLAB 保存数据。

save x.mat x

成为:

save x.txt x -ascii