0

我在 matlab 中运行 DCT 代码,我想将压缩文件 ( .mat) 读入 ac 代码。但是,我不确定这是否正确。我还没有完成我的代码,但我想请求解释如何从我的文件创建一个 c++ 可读.mat文件。

当涉及到文件的二进制浮点详细信息时,我有点.mat困惑.txt。有人请给我解释一下。

4

4 回答 4

4

似乎您有很多选择,具体取决于您的确切需求、时间和技能水平(在 Matlab 和 C++ 中)。显而易见的是:

ASCII 文件

您可以使用语法在 Matlab 中生成 ASCII 文件,也可以使用 c 样式命令save(filename, variablename, '-ascii')创建更自定义的格式。fprintf然后,在 C 或 C++ 程序中,使用fscanf.

这通常是最简单的,并且在许多情况下已经足够好了。人类可以使用 notepad++、emacs 等读取文件这一事实是一个很好的健全性检查(尽管这通常被高估了)。

有两个很大的缺点。首先,文件非常大(一个 8 字节的双精度数需要大约 19 个字节来存储在 ASCII 中)。其次,您必须非常小心,以尽量减少不可避免的精度损失。

磁盘上的字节

对于一个简单的数字数组(例如,一个 32×32 的双精度数组),您可以简单地使用fwriteMatlab 函数将数组写入磁盘。然后在 C/C++ 中使用并行fread函数。

这不会损失精度,速度非常快,并且磁盘上的大小相对较小。

这种方法的缺点是不一定能保存复杂的 Matlab 结构。

Mathworks 提供的 C 库

由于这是一个非常常见的问题,Mathworks 实际上通过直接 C 实现读取/写入 *.mat 文件所需的函数来解决这个问题。我没有使用过这个特定的库,但通常他们提供的库很容易集成。从这里可以找到一些文档:http: //www.mathworks.com/help/matlab/read-and-write-matlab-mat-files-in-cc-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 文件格式的任何未来更改的影响。参见h5writeMatlab 中的命令。

从 C/C++ 端开始运行仍然需要一些努力,所以如果你的项目需要,我只会走这条路。

于 2013-01-30T17:28:32.887 回答
1

.mat是 MATLAB 本身的特殊格式。您可以做的是.mat在 MATLAB 工作区中加载您的文件:

load file.mat

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

于 2013-01-30T06:29:49.607 回答
0

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

save x.mat x

变成:

save x.txt x -ascii    
于 2013-01-30T07:03:15.880 回答
0

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

于 2013-01-30T06:43:40.817 回答