SROTM 应用修正的 Givens 变换,到 2×N 矩阵其中表示转置。 的元素位于 SX(LX+I*INCX),I = 0:N-1,其中 LX = 1 如果 INCX >= 0,否则 LX = (-INCX)*N,SY 使用 LY 和 INCY 同理。当 SPARAM(1)=SFLAG 时,具有以下形式之一
有关 SPARAM 中数据存储的描述,请参阅 SROTMG。
类型 | 意图 | 可选 | 属性 | 名称 | ||
---|---|---|---|---|---|---|
integer(kind=ilp), | intent(in) | :: | n | |||
real(kind=sp), | intent(inout) | :: | sx(*) | |||
integer(kind=ilp), | intent(in) | :: | incx | |||
real(kind=sp), | intent(inout) | :: | sy(*) | |||
integer(kind=ilp), | intent(in) | :: | incy | |||
real(kind=sp), | intent(in) | :: | sparam(5) |
pure subroutine stdlib_srotm(n,sx,incx,sy,incy,sparam) !! SROTM applies the modified Givens transformation, \(H\), to the 2-by-N matrix !! $$ \left[ \begin{array}{c}SX^T\\SY^T\\ \end{array} \right], $$ !! where \(^T\) indicates transpose. The elements of \(SX\) are in !! SX(LX+I*INCX), I = 0:N-1, where LX = 1 if INCX >= 0, else LX = (-INCX)*N, !! and similarly for SY using LY and INCY. !! With SPARAM(1)=SFLAG, \(H\) has one of the following forms: !! $$ H=\underbrace{\begin{bmatrix}SH_{11} & SH_{12}\\SH_{21} & SH_{22}\end{bmatrix}}_{SFLAG=-1}, !! \underbrace{\begin{bmatrix}1 & SH_{12}\\SH_{21} & 1\end{bmatrix}}_{SFLAG=0}, !! \underbrace{\begin{bmatrix}SH_{11} & 1\\-1 & SH_{22}\end{bmatrix}}_{SFLAG=1}, !! \underbrace{\begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}}_{SFLAG=-2}. $$ !! See SROTMG for a description of data storage in SPARAM. ! -- reference blas level1 routine -- ! -- reference blas is a software package provided by univ. of tennessee, -- ! -- univ. of california berkeley, univ. of colorado denver and nag ltd..-- ! Scalar Arguments integer(ilp), intent(in) :: incx, incy, n ! Array Arguments real(sp), intent(in) :: sparam(5) real(sp), intent(inout) :: sx(*), sy(*) ! ===================================================================== ! Local Scalars real(sp) :: sflag, sh11, sh12, sh21, sh22, two, w, z, zero integer(ilp) :: i, kx, ky, nsteps ! Data Statements zero = 0.0_sp two = 2.0_sp sflag = sparam(1) if (n<=0 .or. (sflag+two==zero)) return if (incx==incy.and.incx>0) then nsteps = n*incx if (sflag<zero) then sh11 = sparam(2) sh12 = sparam(4) sh21 = sparam(3) sh22 = sparam(5) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w*sh11 + z*sh12 sy(i) = w*sh21 + z*sh22 end do else if (sflag==zero) then sh12 = sparam(4) sh21 = sparam(3) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w + z*sh12 sy(i) = w*sh21 + z end do else sh11 = sparam(2) sh22 = sparam(5) do i = 1,nsteps,incx w = sx(i) z = sy(i) sx(i) = w*sh11 + z sy(i) = -w + sh22*z end do end if else kx = 1 ky = 1 if (incx<0) kx = 1 + (1-n)*incx if (incy<0) ky = 1 + (1-n)*incy if (sflag<zero) then sh11 = sparam(2) sh12 = sparam(4) sh21 = sparam(3) sh22 = sparam(5) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w*sh11 + z*sh12 sy(ky) = w*sh21 + z*sh22 kx = kx + incx ky = ky + incy end do else if (sflag==zero) then sh12 = sparam(4) sh21 = sparam(3) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w + z*sh12 sy(ky) = w*sh21 + z kx = kx + incx ky = ky + incy end do else sh11 = sparam(2) sh22 = sparam(5) do i = 1,n w = sx(kx) z = sy(ky) sx(kx) = w*sh11 + z sy(ky) = -w + sh22*z kx = kx + incx ky = ky + incy end do end if end if return end subroutine stdlib_srotm