在BLAS中有例如
的例程dscal scale a vector by a constant
dinit initialize a vector with given value
daxpy perform y = a*x + y
等等。但是显然没有用于向量加法或向量减法的例程。如果这是真的,那是什么原因呢?
特别是因为有例程执行更简单的操作,例如dinit
或dscal
。
当然可以使用daxpy
a=1
或a=-1
来执行给定向量的加法/减法,但在我看来过于复杂。
答案 0 :(得分:7)
为了找到合理的解释,我们必须回到BLAS history
在那里,我们可以了解到Level 1在Level 2,3之前设计得很好( 2级是1987年,3级是1989年)。
关于1级历史,在1979年CL Lawson等人的论文Basic Linear Algebra Subprograms for Fortran Usage中。我们可以阅读,第3页
在包装中包含操作的标准是它 应该只涉及一个级别的循环,并在通常情况下发生 数值线性代数算法,如高斯消元法 或使用正交变换的各种消除方法。
本文基于Hanson等人的初始规范,1973 A Proposal for Standard Linear Algebra Subprograms。在本文档中,您可以再次阅读:
例如,已经发现[Krogh(1)]使用组装 用于求解线性的双精度程序中的编码模块 基于Householder transfZormations和列缩放的方程式 和列交换减少了Univac 1108上的执行时间 相对于仔细书写时所需的时间,15%至30% 使用了Fortran模块。
之后
根据上述,我们认为属于I类的操作 所述标准是:(1)两个点积(内积) 向量,基本向量运算,y:= ax + y其中x和y是 n向量和a是标量,(3)Givens 2 x 2正交 变换应用于2 x n子矩阵。
我们可以看到主要关注的是使用线性替换,Givens旋转或Householder转换来实现算法(线性求解器......)。在这种情况下,引用的参考文献中解释的最重要的操作是axpy,scaling,dot,norm等。目标不是提供一组完整的向量运算,如加法,减法等......但只是为了集中精力努力完成一小部分程序。