使用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解析逻辑发生了变化:当数值以整数开头时,新版本可能优先按整数类型解析,后续转存到浮点矩阵时丢失了小数精度;或者默认输出格式被调整为截断小数位的科学计数法,导致显示时看起来丢失了小数部分。
解决方法
- 强制指定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);
- 调整输出显示格式
如果是显示问题而非实际数据丢失,修改Armadillo的打印精度和样式:
// 设置显示8位小数 arma::arma_set_print_precision(8); // 使用十进制格式显示(而非科学计数法) arma::arma_set_print_style(arma::print_decimal); fromMatlab.print();
- 检查编译配置
确保编译Armadillo时启用了完整的浮点支持,未被编译器优化限制数值解析精度。
内容的提问来源于stack exchange,提问作者pei-dev
相关产品推荐
相关产品推荐

