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

时间:2013-01-30 06:07:08

标签: c++ matlab image-processing compression

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

当谈到.mat.txt然后二进制,浮动文件细节时,有点困惑。有人请向我解释一下。

4 个答案:

答案 0 :(得分:4)

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

ASCII文件

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

这通常最容易,而且在很多情况下都足够好。人类可以使用记事本++,emacs等读取文件这一事实是一个很好的理智检查,(虽然这经常被高估)。

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

<强>字节上-A-磁盘

对于一个简单的数字数组(例如,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 ++端开始运行仍然需要付出一些努力,所以如果你的项目需要它,我只会走这条路。

答案 1 :(得分:1)

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

load file.mat

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

答案 2 :(得分:0)

你也可以使用matlab的dlmwrite来写一个分隔的ascii文件,这个文件很容易在C中阅读(也是人类可读的)虽然如果它是问题的核心,它可能不会被压缩

答案 3 :(得分:0)

添加到已经提到的内容,您可以使用-ascii从MATLAB保存数据。

save x.mat x

变为:

save x.txt x -ascii