Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何保存c++;可读的.mat文件_C++_Matlab_Image Processing_Compression - Fatal编程技术网

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

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读取该文件的内容

我正在matlab中运行一个DCT代码,我想将压缩文件(
.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-style
fprintf
命令创建更自定义的格式。然后,在C或C++程序中,使用<代码> fSCANF 这通常是最简单的,在许多情况下已经足够好了。人类可以使用notepad++、emacs等来读取文件,这是一个很好的理智检查(尽管这常常被高估)

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

磁盘上的字节数

对于简单的数字数组(例如,32乘32的双精度数组),只需使用
fwrite
Matlab函数将数组写入磁盘即可。然后在C/C++中使用parallel
fread
函数

这不会降低精度,速度非常快,而且磁盘上的大小相对较小

这种方法的缺点是不一定能保存复杂的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-style
fprintf
命令创建更自定义的格式。然后,在C或C++程序中,使用<代码> fSCANF 这通常是最简单的,在许多情况下已经足够好了。人类可以使用notepad++、emacs等来读取文件,这是一个很好的理智检查(尽管这常常被高估)

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

磁盘上的字节数

对于简单的数字数组(例如,32乘32的双精度数组),只需使用
fwrite
Matlab函数将数组写入磁盘即可。然后在C/C++中使用parallel
fread
函数