LAPACK xgeqr2.f 算法总结推导

2024-02-24 03:44

本文主要是介绍LAPACK xgeqr2.f 算法总结推导,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以 DGEQR2 函数为例,其分为两步:

先计算Householder vector,调用了 DLARFG(  )

然后实施了Householder 变换,调用了 DLARF(  )

接下来先分析DLARFG(  )的算法

源代码如下:

*> \brief \b DLARFG generates an elementary reflector (Householder matrix).
*
*  =========== DOCUMENTATION ===========
*
* Online html documentation available at
*            http://www.netlib.org/lapack/explore-html/
*
*> \htmlonly
*> Download DLARFG + dependencies
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlarfg.f">
*> [TGZ]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlarfg.f">
*> [ZIP]</a>
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlarfg.f">
*> [TXT]</a>
*> \endhtmlonly
*
*  Definition:
*  ===========
*
*       SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )
*
*       .. Scalar Arguments ..
*       INTEGER            INCX, N
*       DOUBLE PRECISION   ALPHA, TAU
*       ..
*       .. Array Arguments ..
*       DOUBLE PRECISION   X( * )
*       ..
*
*
*> \par Purpose:
*  =============
*>
*> \verbatim
*>
*> DLARFG generates a real elementary reflector H of order n, such
*> that
*>
*>       H * ( alpha ) = ( beta ),   H**T * H = I.
*>           (   x   )   (   0  )
*>
*> where alpha and beta are scalars, and x is an (n-1)-element real
*> vector. H is represented in the form
*>
*>       H = I - tau * ( 1 ) * ( 1 v**T ) ,
*>                     ( v )
*>
*> where tau is a real scalar and v is a real (n-1)-element
*> vector.
*>
*> If the elements of x are all zero, then tau = 0 and H is taken to be
*> the unit matrix.
*>
*> Otherwise  1 <= tau <= 2.
*> \endverbatim
*
*  Arguments:
*  ==========
*
*> \param[in] N
*> \verbatim
*>          N is INTEGER
*>          The order of the elementary reflector.
*> \endverbatim
*>
*> \param[in,out] ALPHA
*> \verbatim
*>          ALPHA is DOUBLE PRECISION
*>          On entry, the value alpha.
*>          On exit, it is overwritten with the value beta.
*> \endverbatim
*>
*> \param[in,out] X
*> \verbatim
*>          X is DOUBLE PRECISION array, dimension
*>                         (1+(N-2)*abs(INCX))
*>          On entry, the vector x.
*>          On exit, it is overwritten with the vector v.
*> \endverbatim
*>
*> \param[in] INCX
*> \verbatim
*>          INCX is INTEGER
*>          The increment between elements of X. INCX > 0.
*> \endverbatim
*>
*> \param[out] TAU
*> \verbatim
*>          TAU is DOUBLE PRECISION
*>          The value tau.
*> \endverbatim
*
*  Authors:
*  ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*                                                                   
*> \ingroup doubleOTHERauxiliary
*
*  =====================================================================SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )
*
*  -- LAPACK auxiliary routine --
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*
*     .. Scalar Arguments ..INTEGER            INCX, NDOUBLE PRECISION   ALPHA, TAU
*     ..
*     .. Array Arguments ..DOUBLE PRECISION   X( * )
*     ..
*
*  =====================================================================
*
*     .. Parameters ..DOUBLE PRECISION   ONE, ZEROPARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
*     ..
*     .. Local Scalars ..INTEGER            J, KNTDOUBLE PRECISION   BETA, RSAFMN, SAFMIN, XNORM
*     ..
*     .. External Functions ..DOUBLE PRECISION   DLAMCH, DLAPY2, DNRM2EXTERNAL           DLAMCH, DLAPY2, DNRM2
*     ..
*     .. Intrinsic Functions ..INTRINSIC          ABS, SIGN
*     ..
*     .. External Subroutines ..EXTERNAL           DSCAL
*     ..
*     .. Executable Statements ..
*IF( N.LE.1 ) THENTAU = ZERORETURNEND IF
*XNORM = DNRM2( N-1, X, INCX )
*IF( XNORM.EQ.ZERO ) THEN
*
*        H  =  I
*TAU = ZEROELSE
*
*        general case
*BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )KNT = 0IF( ABS( BETA ).LT.SAFMIN ) THEN
*
*           XNORM, BETA may be inaccurate; scale X and recompute them
*RSAFMN = ONE / SAFMIN10       CONTINUEKNT = KNT + 1CALL DSCAL( N-1, RSAFMN, X, INCX )BETA = BETA*RSAFMNALPHA = ALPHA*RSAFMNIF( (ABS( BETA ).LT.SAFMIN) .AND. (KNT .LT. 20) )$         GO TO 10
*
*           New BETA is at most 1, at least SAFMIN
*XNORM = DNRM2( N-1, X, INCX )BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )END IFTAU = ( BETA-ALPHA ) / BETACALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
*
*        If ALPHA is subnormal, it may lose relative accuracy
*DO 20 J = 1, KNTBETA = BETA*SAFMIN20      CONTINUEALPHA = BETAEND IF
*RETURN
*
*     End of DLARFG
*END

摘取将其常规运算部分归结如下,并加入了注释:

*   计算(x_1, x_2, ..., x_n-1)的模长norm,即 sqrt(x1*x1 + x2*x2 + ... xn-1*xn-1)XNORM = DNRM2( N-1, X, INCX )*   计算(x_0, x_1, x_2, ..., x_n-1)的模长,并且取符号正好与 x0 == ALPHA 的符号相反
*   其中的 DLAPY2(s, t) = sqrt(s*s + t*t);BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )*   按照Householder常规, TAU = 2.0/X^T*X = 2.0/(  1.0*1.0 + (x1/(ALPHA-BETA))**2 + (x2/(ALPHA-BETA))**2 + ... + (x_n-1/(ALPHA-BETA))**2  ) 然后就可以推导出 TAU = (BETA-ALPHA)/BETATAU = ( BETA-ALPHA ) / BETA
*   对 X 做缩放, st. 理念中的 X(0) == 1.0 ,但是下面语句中的 X 中只包含了从X(1) 到 X(n-1)CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
*   ALPHA 即 Y(0) = (Px)(0) = ((I - beta*V*V^T)x)(0) = Y(0)ALPHA = BETA

 

至此,这个Householder vector 就计算出来了。

效果相当于给定

X=\left[ \begin{array}{c} ALPHA\\ x_1\\ \vdots\\ x_{n-1}\\ \end{array} \right ]

计算出其Householder vector:

H=\left[ \begin{array}{c} 1.0\\ h_1\\ \vdots\\h_{n-1}\\ \end{array} \right ]

同时计算出了 Y=PX:

Y=H*X =\left[ \begin{array}{c} h_0\\ h_1=0\\ \vdots\\ h_{n-1}=0\\ \end{array} \right ]

其中 h_0 存储在变量 ALPHA 中了。

然后又利用 DLARF(  )将Householder vector 应用到了 A矩阵的剩余部分。

接下来分析 DLARF(  ) 的算法实现。

\documentclass{article}
\title{House}\begin{document}
\maketitle
After we calculated $v$ and $\beta$:
$$[v,\beta]= house(A(j:m, j))$$
we should update A by:
$$A = (I-\beta vv^T)A$$Let
$$v=
\left[\begin{array}{c}v_1\\v_2\\\vdots\\v_m\end{array}
\right]
$$
then,
$$vv^T=
\left[\begin{array}{cccc}v_1v_1 & v_1v_2 & \cdots & v_1v_m\\v_2v_1 & v_2v_2 & \cdots & v_2v_m\\\vdots & \vdots & \ddots & \vdots\\v_mv_1 & v_mv_2 & \cdots & v_mv_m\end{array}
\right]
$$As
$$
A = (I-\beta vv^T)A=A - \beta vv^TA
$$
to calculat $(vv^TA)$,
$$
vv^TA=v(v^TA)=
\left[\begin{array}{c}v_1\\v_2\\\vdots\\v_m\end{array}
\right]
\left[ \sum_{k=1}^m(v_ka_{k1}) \,\, \sum_{k=1}^m(v_ka_{k2}) \cdots \sum_{k=1}^m(v_ka_{kn})\right]
$$Let $b_j=\sum_{k=1}^m(v_ka_{kj})$$$
W=vv^TA=v(v^TA)=
\left[\begin{array}{c}v_1\\v_2\\\vdots\\v_m\end{array}
\right]
\left[b_1\,\,b_2 \cdots b_n\right]
=
\left[\begin{array}{cccc}v_1b_1 & v_1b_2 & \cdots & v_1b_n\\v_2b_1 & v_2b_2 & \cdots & v_2b_n\\\vdots & \vdots & \ddots & \vdots\\v_mb_1 & v_mb_2 & \cdots & v_mb_n\\\end{array}
\right]
$$
Then,
$$
A=(I-\beta vv^T)A = A-\beta vv^TA = A-\beta W
$$$\mathbf{Algrithm}\,\, of\,\, QR$:\\
For(J=1; J<M; j++)\\
....$[v, \beta] = house(A(J:M, J))$\\
....For j=J; j$\le$N; j++;\\
................$b_j=\sum_{k=j}^M(v_ka_k^j)$;\\
................for i=J; i$\le$M; i++;\\
....................$a_{ij} = a_{ij}-\beta v_ib_j$\\
....A(J+1:M, J) = v(2:M-J+1)\\
EndFor
\end{document}

这篇关于LAPACK xgeqr2.f 算法总结推导的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740848

相关文章

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ