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

使用Armadillo在C++中加载CSV到fmat时丢失小数问题

Armadillo 12.6加载CSV丢失小数部分问题解决

问题详情

使用Armadillo 12.6版本加载CSV文件时,出现数值小数部分丢失的异常:

  • 加载代码:
arma::fmat fromMatlab;
fromMatlab.load(relPath + "/matrix.csv", arma::auto_detect);
  • 原始CSV内容:
0   0   2   4.8989795   -6.9282032  -4.8989795  -16.970563  -16.970563  28.284271
  • 实际输出(小数部分丢失):
0            0   2.0000e+00   4.0000e+00  -6.0000e+00  -4.0000e+00  -1.6000e+01  -1.6000e+01   2.8000e+01

已尝试更换.mat文件、改用mat/fmat/Mat等类型,问题依然存在;但在Armadillo 7.95版本中无此异常。

原因推测

Armadillo版本升级后,arma::auto_detect的CSV解析逻辑发生了变化:当数值以整数开头时,新版本可能优先按整数类型解析,后续转存到浮点矩阵时丢失了小数精度;或者默认输出格式被调整为截断小数位的科学计数法,导致显示时看起来丢失了小数部分。

解决方法

  1. 强制指定CSV解析格式
    避免使用arma::auto_detect,直接指定arma::csv_ascii格式加载,确保解析为浮点类型:
arma::fmat fromMatlab;
fromMatlab.load(relPath + "/matrix.csv", arma::csv_ascii);

如果CSV是制表符分隔而非逗号,可额外配置解析选项:

arma::csv_opts opts;
opts.delimiter = '\t'; // 根据实际分隔符调整
opts.header = false; // 无表头时设置为false

arma::fmat fromMatlab;
fromMatlab.load(relPath + "/matrix.csv", arma::csv_ascii, opts);
  1. 调整输出显示格式
    如果是显示问题而非实际数据丢失,修改Armadillo的打印精度和样式:
// 设置显示8位小数
arma::arma_set_print_precision(8);
// 使用十进制格式显示(而非科学计数法)
arma::arma_set_print_style(arma::print_decimal);

fromMatlab.print();
  1. 检查编译配置
    确保编译Armadillo时启用了完整的浮点支持,未被编译器优化限制数值解析精度。

内容的提问来源于stack exchange,提问作者pei-dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:37:21