为什么 argmax abs 有一个 blas 子程序 (ISAMAX) 而 argmax 有 none?

Why is there a blas subroutine (ISAMAX) for argmax abs but none for argmax?

为什么会有blas subroutine ISAMAX for argmax abs but not for argmax

在 C++ 中使用 std::max_element 和编译器优化标志 -O3 我得到的速度与 blas_isamax 相当(16 毫秒对 9 毫秒),所以目前我的问题更多出于兴趣而不是出于对速度的需要。

BLAS库是一个科学计算库,它是与LAPACK并行设计的。 ISAMAX 子例程利用向量的无穷范数。更多信息可以参考wikipedia's link。许多LAPACK算法需要无穷范数,所以BLAS库定义了这个标准子程序。

另一方面,在通用计算中广泛需要向量的最大值,引入了 C++ std::max_element。但是这个函数在科学计算中并不常见。

BLAS 旨在提供实现常见线性代数运算所需的低级例程(毕竟, "Basic Linear Algebra Subprograms")。

仅列举众多用途中的一个,在 LU factorization 中选择主元需要获取向量的最大量值元素,这是线性代数最基本的主力之一。相比之下,线性代数基本上不需要获取最大元素,这就是为什么它不是 BLAS 操作之一*。

(*)其实在2001年BLAS技术论坛标准中就建议将max操作加入BLAS,但是还没有被广泛采用。