C++ 如何保存c++;可读的.mat文件
我正在matlab中运行一个DCT代码,我想将压缩文件(C++ 如何保存c++;可读的.mat文件,c++,matlab,image-processing,compression,C++,Matlab,Image Processing,Compression,我正在matlab中运行一个DCT代码,我想将压缩文件(.mat)读入c代码。然而,我不确定这是否正确。我还没有完成我的代码,但是我想请求解释如何从我的代码> .MAT文件中创建C++可读文件。p> 当涉及到.mat,.txt以及二进制、浮点文件的详细信息时,我有点困惑。有人请给我解释一下。.mat是MATLAB本身的特殊格式。 您可以在MATLAB工作区中加载.mat文件: load file.mat 然后使用fopen和fprintf将数据写入文件.txt,然后您就可以用C读取该文件的内容
.mat
)读入c代码。然而,我不确定这是否正确。我还没有完成我的代码,但是我想请求解释如何从我的代码> .MAT文件中创建C++可读文件。p>
当涉及到
.mat
,.txt
以及二进制、浮点文件的详细信息时,我有点困惑。有人请给我解释一下。.mat
是MATLAB本身的特殊格式。
您可以在MATLAB工作区中加载.mat
文件:
load file.mat
然后使用
fopen
和fprintf
将数据写入文件.txt
,然后您就可以用C读取该文件的内容。。mat
是MATLAB本身的特殊格式。
您可以在MATLAB工作区中加载.mat
文件:
load file.mat
然后使用
fopen
和fprintf
将数据写入file.txt
,然后您可以在C中读取该文件的内容。您还可以使用matlab编写一个分隔的asci文件,该文件在C中很容易读取(并且人类可读)虽然如果这是问题的核心,那么它可能不会被压缩,但您也可以使用matlab编写一个分隔的asci文件,该文件在C语言中很容易读取(也很容易被人读取)虽然如果这是问题的核心,它可能不会被压缩,但除了前面提到的内容之外,您可以使用-ascii从MATLAB保存数据
save x.mat x
变成:
save x.txt x -ascii
除了前面提到的内容之外,您还可以使用-ascii从MATLAB保存数据
save x.mat x
变成:
save x.txt x -ascii
看起来您在这里有很多选择,这取决于您的确切需求、时间和技能水平(在Matlab和C++中)。显而易见的是: ASCII文件 您可以使用
save(filename,variablename,'-ASCII')
语法在Matlab中生成ASCII文件,也可以使用c-stylefprintf
命令创建更自定义的格式。然后,在C或C++程序中,使用<代码> fSCANF
这通常是最简单的,在许多情况下已经足够好了。人类可以使用notepad++、emacs等来读取文件,这是一个很好的理智检查(尽管这常常被高估)
有两大缺点。首先,文件非常大(一个8字节的双倍数字需要大约19个字节以ASCII格式存储)。其次,您必须非常小心,以尽量减少不可避免的精度损失
磁盘上的字节数
对于简单的数字数组(例如,32乘32的双精度数组),只需使用fwrite
Matlab函数将数组写入磁盘即可。然后在C/C++中使用parallelfread
函数
这不会降低精度,速度非常快,而且磁盘上的大小相对较小
这种方法的缺点是不一定能保存复杂的Matlab结构
Mathworks提供的C库
由于这是一个非常常见的问题,Mathworks实际上通过直接用C实现读取/写入*.mat文件所需的函数来解决这一问题。我没有使用过这个特定的库,但通常它们提供的库很容易集成。从这里可以找到一些文档:
这应该是一个非常健壮的解决方案,并且对更改相对不敏感,因为它是主流的、受支持的Matlab工具集的一部分
基于HDF5的*.mat文件
对于最新版本的Matlab,您可以使用符号save(文件名,variablename,'-v7.3')
强制Matlab以基于HDF5的格式保存文件。然后,您可以使用HDF5组中的工具来处理该文件。请注意一个基于java的GUI查看器()和C++、C++和FORTRAN的库。
这是一种存储二进制数据的非脆弱方法。让库在代码中工作也需要一些工作
一个缺点是Mathworks可能会更改将Matlab数据类型映射到HDF5文件的详细信息。如果你真的想变得强壮,你可以试试
自定义HDF5文件
与Mathworks决定使用的任何格式不同,直接创建一个HDF5文件并将数据从Matlab推送到其中并不难。这使您可以控制压缩、数据块大小、数据集层次结构和名称等内容。它还可以使您避免将来更改默认的*.mat文件格式。请参见Matlab中的h5write
命令
从C/C++端开始运行仍然需要一点努力,因此我只会在项目许可的情况下走这条路。根据您的具体需求、时间和技能水平(在Matlab和C++中),您似乎有很多选择。显而易见的是: ASCII文件 您可以使用
save(filename,variablename,'-ASCII')
语法在Matlab中生成ASCII文件,也可以使用c-stylefprintf
命令创建更自定义的格式。然后,在C或C++程序中,使用<代码> fSCANF
这通常是最简单的,在许多情况下已经足够好了。人类可以使用notepad++、emacs等来读取文件,这是一个很好的理智检查(尽管这常常被高估)
有两大缺点。首先,文件非常大(一个8字节的双倍数字需要大约19个字节以ASCII格式存储)。其次,您必须非常小心,以尽量减少不可避免的精度损失
磁盘上的字节数
对于简单的数字数组(例如,32乘32的双精度数组),只需使用fwrite
Matlab函数将数组写入磁盘即可。然后在C/C++中使用parallelfread
函数