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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费