如何用犰狳加载matlab矩阵?
Posted
技术标签:
【中文标题】如何用犰狳加载matlab矩阵?【英文标题】:how to load matlab matrix with armadillo? 【发布时间】:2014-04-07 03:43:43 【问题描述】:我知道 matlab 矩阵可以通过某些方式加载到 C++ 程序中,而这些方式似乎都不高效或方便。 我看到其他人修改了'.mat'文件的标题,然后可以直接将它加载到带有犰狳的C++程序中。
有人知道如何修改头文件吗?
这不仅仅是将 matlab '.mat' 文件保存为 ascii 格式。加载时间和存储空间大于二进制格式。 要存储一个 2GB 的二进制 mat 文件,我至少需要 20GB 来以 ASCII 格式存储它。 加载 100MB 二进制 mat 文件需要不到 1 秒,加载相同大小的 ASCII 文本数据需要更长的时间。
我不认为将 matlab mat 文件保存为 ASCII 格式并将其加载到犰狳中是一个很好的解决方案。
【问题讨论】:
如果您有 HDF5 库,请配置 Armadillo 以使用它。然后在 Matlab 中以 HDF5 格式保存矩阵,犰狳(启用 HDF5)应该能够读取。另一种选择是使用 MATIO 库来读取 Matlab 文件:sourceforge.net/projects/matio 另外,您可以将您的 C++ 程序构建为 Matlab Executable (MEX)。 Matlab 将其变量传递给每个引用的 mex 函数。 【参考方案1】:根据Armadillo documentation:
file_type 可以是以下之一: ... raw_ascii: 以原始 ASCII 格式存储的数字数据,没有标题。数字由空格分隔。每行的列数必须相同。多维数据集作为一个切片加载。使用 -ascii 选项保存在 Matlab/Octave 中的数据可以在 Armadillo 中读取,复数除外。复数以标准 C++ 表示法存储,它是一个用括号括起来的元组:例如。 (1.23,4.56) 表示 1.24 + 4.56i。
因此,您应该能够使用以下代码加载以文本格式编写的 Matlab 矩阵,该矩阵包含在名为“MatlabMatrix.mat”的文件中:
arma::mat fromMatlab;
fromMatlab.load("MatlabMatrix.mat", arma::raw_ascii);
另外,可以在here找到相关问题。
【讨论】:
嗨,也许我需要稍微修改一下我的问题。我的数据文件超过 1GB。加载 ASCII 格式的“.mat”文件,就像加载 txt 文件一样。加载时间很慢。要加载 100MB 的二进制 .mat 文件,我只需要不到 1 秒的时间。要加载 ascii .mat 文件,我需要 10 多秒。如果我想加载 1GB 的文件,会有更大的差异。事实上我正在使用你的解决方案,而我觉得我可以做得更好 加载参数应该是 arma::raw_ascii 而不是 arma::arma_ascii,arma_ascii 有一个带有尺寸信息的 header 以加快加载速度【参考方案2】:您可以在 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
选项。如果您对该选项感兴趣,我也可以告诉您如何操作。
【讨论】:
能否详细说明如何包含矩阵维度?以上是关于如何用犰狳加载matlab矩阵?的主要内容,如果未能解决你的问题,请参考以下文章