我在matlab中运行DCT代码,我想将压缩文件(.mat
)读入c代码。但是,我不确定这是对的。我还没有完成我的代码,但我想请求解释如何从我的.mat
文件创建一个c ++可读文件。
当谈到.mat
,.txt
然后二进制,浮动文件细节时,有点困惑。有人请向我解释一下。
答案 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
然后使用fopen
和fprintf
将数据写入file.txt
,然后您可以在C中阅读该文件的内容。
答案 2 :(得分:0)
你也可以使用matlab的dlmwrite来写一个分隔的ascii文件,这个文件很容易在C中阅读(也是人类可读的)虽然如果它是问题的核心,它可能不会被压缩
答案 3 :(得分:0)
添加到已经提到的内容,您可以使用-ascii从MATLAB保存数据。
save x.mat x
变为:
save x.txt x -ascii