- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在运行来自 Anaconda 的最新版本的 Python/Numpy(1.15.4),与 MKL 链接。我使用以下 epsilon:
epsilon = 2**(-53)
因此 1.0 + epsilon 等于 1.0。然后我定义了以下 numpy 数组,除了前 8 个元素等于 1 之外,它填充了 epsilon。
import numpy as np
n = 1000000
a = np.full(n, epsilon)
a[0:8] = 1.0
如果您使用从左到右的经典缩减来计算数组的总和,您应该得到恰好 8.0,因为所有 epsilon 都不会随着缩减的进行而改变。但我很惊讶地看到这一点
print(np.sum(a))
返回 8.000000000111008,这不是我所期望的。我试图将那些放在中间和数组的末尾以检查总和是否没有向后完成,但没有任何变化。知道如何求和吗?
PS:我很清楚浮点运算很棘手,而且 + 与浮点没有关联,这使得归约的结果取决于求和的顺序。但是我找不到这里使用的求和顺序。
最佳答案
如评论中所述,numpy
使用成对求和。因此,当调用堆栈开始解析时,在递归成对求和结束时,求和(大致)看起来像这样:
(1+1) + (1+1) + (1+1) + (1+1) + (epsilon + epsilon) + ... + (epsilon + epsilon)
(2+2) + (2+2) + (2*epsilon) + (2*epsilon) + ... + (2*epsilon)
(4+4) + (4*epsilon) + (4*epsilon) + ... + (4*epsilon)
8 + (8*epsilon) + (8*epsilon) + ... + (8*epsilon)
8 + (16*epsilon) + (16*epsilon) + ... + (16*epsilon)
...
8 + (999992*epsilon)
您说 1.0 + epsilon
等于 1.0
是正确的。很容易认为 x + epsilon == x
对所有 x
。当 x
为“大”时它确实成立,但是,当 x == epsilon
(即 epsilon + epsilon != epsilon
).因此 epsilon + epsilon
术语将开始堆积:
In [27]: epsilon = 2**(-53)
In [28]: 1.0 + epsilon == 1.0
Out[28]: True
In [29]: 2.0 + epsilon == 2.0
Out[29]: True
In [30]: epsilon + epsilon == epsilon
Out[30]: False
In [31]: epsilon
Out[31]: 1.1102230246251565e-16
In [32]: epsilon + epsilon
Out[32]: 2.220446049250313e-16
In [33]: 123*epsilon
Out[33]: 1.3655743202889425e-14
我不能完全得到 numpy
的答案,但我们可以非常接近:
In [36]: 8 + (999992*epsilon)
Out[36]: 8.000000000111022
In [62]: def pairwise_sum(arr):
...: if len(arr) <= 2:
...: return sum(arr)
...: midpoint = len(arr)//2
...: first_half = arr[:midpoint]
...: second_half = arr[midpoint:]
...: return pairwise_sum(first_half) + pairwise_sum(second_half)
...:
In [63]: pairwise_sum(a)
Out[63]: 8.0000000001110205
所以这里显然有一些其他差异(一些实现细节),但希望这能让您相信 numpy
实际上是在使用成对求和。
HTH.
关于python - Numpy sum(Numpy 1.15.4,与 MKL 链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54053029/
dgesvd 似乎是一个具有 LAPACK_COL_MAJOR 布局的 LAPACKE_dgesvd,但查看 dgesvd 的示例和 LAPACKE_dgesvd dgesvd 示例中似乎有一个额外的
我尝试使用 g++ 用 intel mkl 11.1 进行编译: g++ -m32 test.c -lmkl_intel -lmkl_intel_thread -lmkl_core -liomp5 -
我有一个 cython 优化的速度程序,但速度仍然很慢。我想知道我的 cython 程序是否使用 OpenBLAS 还是 MKL(链接 openblas/mkl 库)?如何知道这一点? 最佳答案 这与
我正在尝试将 MKL 与 IPOPT 关联起来以提高性能。我已经通读了以下线程,它帮助我解决了很多问题。 Linking Ipopt with Intel MKL 但是,当我使用以下命令配置 Ipop
我正在努力尝试在 Windows 10 上生成 python 可执行文件。我已经尝试过 Cannot load mkl_intel_thread.dll on python executable 中提
我一直在尝试在 Windows 上使用 BLAS 获得一个快速运行的 numpy,到目前为止,唯一可行的方法是从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#
我尝试设置一个文件来使用 PyCharm 编写 AI。 我正在使用的教程:https://www.youtube.com/watch?v=ujTCoH21GlA 当我运行代码时: $ import t
我有以下 Fortran 代码(在堆栈溢出的许多答案之上进行了修改......) Program blas integer, parameter :: dp = selected_real_k
操作系统:windows 10 64位 编译器:vc2015 64bits update 3 MXnet:1.3.1 构建mxnet 1.3.1(mxnet1.4.0有bug,windows下无法构建
我有一个非常大的矩形和方形 float 以及复杂的矩阵。我想知道是否有适当的 MKL 转置例程? MKL中有mkl_?imatcopy,请帮我举个例子。 我已经尝试过这个,但它没有转置矩阵 s
我正在运行 mkl_lab_solution.c这是使用 MKL 的示例,我可以正确编译它,但在运行时出现段错误。我的运行时如下: 操作系统是centos 6.3 gcc的版本是4.1.2 mkl 是
我有 win10、x64、i7-3770K 我从下载了 numpy-1.11.0+mkl-cp35-cp35m-win_amd64.whl http://www.lfd.uci.edu/~gohlke
MKL 的串行和并行版本在两个不同的库中实现。这些库的函数具有相同的名称。所以你不能直接加载两个库并分别调用每个函数,而不会在编译时发生冲突。 我想开发一个函数的包装器(例如 OpenGL Exten
我在一台新机器上工作,但找不到 MKL 库的路径。有没有办法知道它们是否安装以及安装在哪里?我尝试了 find -name,但我什么也没找到。也许它们根本没有安装。但是如何确定呢? 最佳答案 尝试使用
我正在尝试使用英特尔 MKL 库中的cblas_idamax函数来获取输入矩阵每列的最大值。在某些执行中我得到了正确的答案,但在其他执行中我得到了错误的索引。这是我的 C 代码示例: const MK
我正在尝试开发一个将矩阵 A 和 B 相乘的函数,它们是通用格式但本质上是稀疏的。这些矩阵包含复数。我的问题是,当我不使用该函数并将所有内容写入 main() 中时,乘法对于任何大小的数组都完美有效。
我尝试使用英特尔 MKL 提供的 cblas 将两个矩阵(例如 A 和 B)的乘积转换为 C。有什么原因会导致错误吗? double * A, *B, *C; A = (double *) callo
我必须使用 MKL 来求解线性方程组。该方程组用于求解二维泊松问题,因此正好有 5 条对角线不同于 0。方程组 Ax=b 的矩阵 A 是方阵,大小为 n*n。我检查了英特尔的文档,对调用顺序有点困惑。
我无法让英特尔 MKL 在 C 中正常工作。我有以下测试程序: #include "stdafx.h" #include"mkl.h" int main() { int one = 1;
有没有办法在 MKL 中计算矩阵的矩阵指数?我查看了引用手册,但只能找到用于查找 vector 元素指数的 v?Exp()。 (我基本上是在寻找 MATLAB expm() 等价物) 最佳答案 可以使
我是一名优秀的程序员,十分优秀!