为啥 argmax abs 有一个 blas 子程序(ISAMAX),而 argmax 没有?

Posted

技术标签:

【中文标题】为啥 argmax abs 有一个 blas 子程序(ISAMAX),而 argmax 没有?【英文标题】:Why is there a blas subroutine (ISAMAX) for argmax abs but none for argmax?为什么 argmax abs 有一个 blas 子程序(ISAMAX),而 argmax 没有? 【发布时间】:2015-02-10 16:08:48 【问题描述】:

为什么 argmax abs 有 blas 子程序 ISAMAX 而 argmax 没有?

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

【问题讨论】:

【参考方案1】:

BLAS 旨在提供实现常见线性代数运算所需的低级例程(毕竟它“基本线性代数子程序”)。

仅举一种用途,在LU factorization 中获取向量的最大元素是必要的,这是线性代数最基本的主力之一。相比之下,线性代数基本上不需要获取最大元素,这就是为什么它不是 BLAS 运算之一*。

(*) 实际上,在 2001 年 BLAS 技术论坛标准中建议将最大操作添加到 BLAS,但尚未得到广泛采用。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于为啥 argmax abs 有一个 blas 子程序(ISAMAX),而 argmax 没有?的主要内容,如果未能解决你的问题,请参考以下文章

在多维数组上使用 numpy.argmax()

复矩阵将实矩阵乘以 BLAS

python复数情况下argmax和matlab中max函数的区别

单片机C语言中,中断子程序后面为啥要加interrupt这个单词?

argmax( )

稀疏 BLAS 不包含在 BLAS 中吗?