犰狳中的矩阵(向量)在从文件加载后获得新的小数位

Posted

技术标签:

【中文标题】犰狳中的矩阵(向量)在从文件加载后获得新的小数位【英文标题】:A matrix (vector) in armadillo gains new decimal places after loading it from a file 【发布时间】:2016-03-17 22:54:55 【问题描述】:

我想将源代码从 python 转移到 c++ (#include )。 我有一个向量(矩阵)保存到“my_vec.txt”,尺寸为 1x200:

-0.082833
0.151422
-0.088526
...
...
0.115863
0.131043
0.041844

我想在 python 中计算两个 my_vec 的点积(这只是一个测试示例)。

result = my_vec.dot(my_vec)
print (str.format("0:.10f", result))

结果给了我 6.1402435303

当我尝试在 c++ 中用犰狳做同样的操作时:

float result;
result = dot(my_vec, my_vec);
std::cout << std::setprecision(10) << result;

我得到 6.140244007

因此,在从文本文件中加载值后,我在犰狳中查看了我的浮点向量 my_vec。看起来是这样的:

 -8.283299952745e-002
  1.514219939709e-001
 -8.852600306273e-002
 ...
 ...
 1.158630028367e-001
 1.310430020094e-001
 4.184399917722e-002

添加了很多小数位(my_vec.txt 中不存在)。当然,这种差异会影响进一步的计算。我怎样才能防止这种情况发生?

【问题讨论】:

【参考方案1】:

看起来您在 C++ 代码中使用的精度较低。 C++ float 通常对应 NumPy float32;如果您想要与 NumPy float64 等效的精度,那通常是 C++ double

【讨论】:

感谢您的回复。我在 python 中加载矩阵的方式是:my_vec = np.loadtxt(my_vec_file, dtype=np.float32)。它是float32。所以我在犰狳中使用 fvec (用于浮点数)而不是 vec (用于双精度数),但在计算点积后我仍然得到不同的值。我应该在哪里更改精度。提前致谢。 如果我将矩阵保存回 txt 文件(在 python 中),它具有以下精度:-8.283299952745437622e-02 @KTBFFH:如果您故意使用 32 位浮点数,那么这种程度的差异是可以预料的。 32 位浮点数仅保留大约 6 位十进制数字的精度;你只是在强迫程序显示本质上是噪音的数字。 我必须在 c++ 中传输 python 代码,所以不幸的是,如果它调用 np.float32,我必须接受并尝试在 c++ 中重现相同的结果。让我总结一下(向量的第一个值)。 txt: -0.082833 after loadtxt (dtype=np.float32) in python: -8.283299952745437622e-02 after load(.txt) in c++ armadillo: -8.283299952745e-002 两个程序的浮点值的基本噪声是相同的.但是 python 显示更多的数字,这些数字对一些进一步的操作(如乘法)有影响。我如何获得与 python 中相同的犰狳矩阵的精度?提前致谢。 @KTBFFH:加载的结果很可能是相同的——Python 只是显示更多的数字。但是,如果您希望之后所有计算的输出完全相同,则需要专门针对精确再现性的专门库。几乎每个人都为了速度而牺牲了可重复性。

以上是关于犰狳中的矩阵(向量)在从文件加载后获得新的小数位的主要内容,如果未能解决你的问题,请参考以下文章

犰狳向量矩阵乘法

如何将向量转换为犰狳矩阵?

犰狳复矩阵乘法早期逼近

在犰狳中将矩阵除以向量

向量到矩阵犰狳

用犰狳加载大型矩阵