我知道matlab矩阵可以通过某种方式加载到C ++程序中,而这些方法似乎都不是高效或方便的。 我见过其他人修改了“.mat”的标题。文件,然后它可以直接加载到犰狳的C ++程序中。
不仅仅是保存matlab' .mat'归档为ascii格式。加载时间和存储空间大于二进制格式。 要存储2GB二进制文件,我需要至少20GB才能以ASCII格式存储它。 加载100MB二进制mat文件只需不到1秒,加载相同大小的ASCII文本数据需要更长的时间。
我不认为将matlab mat文件保存为ASCII格式并将其加载到armadillo是一个很好的解决方案。
答案 0 :(得分:3)
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。
答案 1 :(得分:2)
您可以在matlab中以低级二进制格式导出数据,然后使用arma::raw_binary
选项将其加载到armadillo中。
e.g。在 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);
加载 armadillo :
arma::mat A;
std::string name = "test.bin";
A.load(name,arma::raw_binary);
A.print("A");
唯一的一点就是你丢失了原始矩阵的矩阵尺寸,因为犰狳以矢量化形式加载它,所以你必须在加载后每手重塑它。
要包含矩阵尺寸,您可以在matlab中保存时模仿armadillo标头,然后在加载时使用arma::arma_binary
选项。如果您对该选项感兴趣,我也可以告诉您如何操作。