如何通过二进制文件将MATLAB矩阵导入Armadillo并保留维度信息
问题根因
你当前使用MATLAB直接写入的是纯原始二进制数据,没有包含Armadillo arma_binary 格式要求的维度、元素类型等元信息,因此Armadillo读取时无法识别矩阵维度,导致后续运算出错。此外arma_binary是Armadillo私有存储格式,无法直接通过MATLAB生成符合规范的文件。
解决方案
这里提供两种可行方案,你可以根据使用场景选择:
方案1:固定维度场景直接指定大小读取(无需修改MATLAB导出代码)
如果你导出的矩阵维度是固定的,直接改用Armadillo的raw_binary格式读取,提前给矩阵设置对应维度即可,同时注意要保证MATLAB写入的元素类型和Armadillo矩阵元素类型完全匹配,避免平台差异导致类型宽度不一致,建议使用固定宽度类型:// 以你示例中的100×1 int32矩阵为例 arma::Mat<int32_t> LocalX(100, 1); std::string localx = "LocalX.bin"; // 用raw_binary读取纯二进制数据 LocalX.load(localx, arma::raw_binary);如果你需要存储的是100×1的double类型矩阵,对应将MATLAB
fwrite的第三个参数改为'double',Armadillo侧改用arma::mat LocalX(100, 1)即可。注:MATLAB和Armadillo均采用列优先存储,读取后元素顺序完全一致,无需额外转置。
方案2:动态维度场景导出时增加维度头信息
如果矩阵维度不固定,在MATLAB导出时先写入矩阵的行数、列数作为头信息,C++读取时先解析头得到维度再加载数据即可:
MATLAB导出代码(以double类型矩阵为例):name = 'LocalX.bin'; [F,err] = fopen(name,'w'); if F<0,error(err);end % 先写入行数、列数,类型为uint64和Armadillo维度类型对齐 fwrite(F, size(A,1), 'uint64'); fwrite(F, size(A,2), 'uint64'); % 写入矩阵实际数据 fwrite(F, A, 'double'); fclose(F);Armadillo侧读取代码:
#include <fstream> #include <armadillo> // ... std::ifstream fin("LocalX.bin", std::ios::binary); uint64_t rows, cols; // 读取维度信息 fin.read(reinterpret_cast<char*>(&rows), sizeof(uint64_t)); fin.read(reinterpret_cast<char*>(&cols), sizeof(uint64_t)); // 构造对应大小的矩阵 arma::mat LocalX(rows, cols); // 读取矩阵数据 fin.read(reinterpret_cast<char*>(LocalX.memptr()), rows * cols * sizeof(double)); fin.close();跨平台使用时注意统一端序,同一设备使用无需额外处理。
内容的提问来源于stack exchange,提问作者Abdulla
相关产品推荐
相关产品推荐

