You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过二进制文件将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:09:04