如何使用犰狳加载 MATLAB 矩阵

how to load matlab matrix with armadillo?

本文关键字:MATLAB 矩阵 加载 何使用      更新时间:2023-10-16

我知道matlab矩阵可以通过某些方式加载到程序中C++而这些方法似乎都没有效率或方便。我看到其他人修改了".mat"文件的标题,然后可以直接将其加载到C++犰狳程序中。

有人知道如何修改头文件吗?

它不仅仅是将matlab".mat"文件保存为ascii格式。加载时间和存储空间大于二进制格式。要存储 2GB 二进制 mat 文件,我至少需要 20GB 以 ASCII 格式存储它。加载 100MB 二进制 mat 文件需要不到 1 秒的时间,加载相同大小的 ASCII 文本数据需要更长的时间。

我不认为将 matlab mat 文件保存为 ASCII 格式并将其加载到犰狳中是一个很好的解决方案。

根据犰狳文档:

file_type可以是以下之一:
...
raw_ascii:
以原始 ASCII 格式存储的数字数据,不带标头。数字用空格分隔。每行中的列数必须相同。多维数据集作为一个切片加载。使用 -ascii 选项保存在 Matlab/Octave 中的数据可以在犰狳中读取,复数除外。复数以标准C++表示法存储,这是一个用括号括起来的元组:例如。(1.23,4.56) 表示 1.24 + 4.56i。

因此,您应该能够使用以下代码加载以文本格式编写的 Matlab 矩阵,该矩阵包含在名为"MatlabMatrix.mat"的文件中:

arma::mat fromMatlab;
fromMatlab.load("MatlabMatrix.mat", arma::raw_ascii);

另外,可以在此处找到相关问题。

您可以将数据导出到低级二进制格式的 matlab 中,然后使用 arma::raw_binary 选项将其加载到犰狳中。

例如,在 MATLAB 中:

m=10;
A = randn(m,m);
name = 'test.bin'
[F,err] = fopen(name,'w');
if F<0,error(err);end
fwrite(F,A,'double');
fclose(F);

装载犰狳

arma::mat A;
std::string name = "test.bin";
A.load(name,arma::raw_binary);
A.print("A");

唯一的问题是你失去了原始矩阵的矩阵尺寸,因为犰狳以矢量化的形式加载它,所以你必须在加载后每只手重新塑造它。

要包含矩阵尺寸,您可以在保存在 matlab 中时模仿犰狳标头,然后在加载时使用 arma::arma_binary 选项。如果您对该选项感兴趣,我也可以告诉您如何操作。