与Fo Householder Transformation QR分解签署问题



我在使用Householder Reflection算法实现QR分解时遇到问题。我得到了分解的正确数字,但符号不正确。我似乎无法解决导致此问题的原因,因为我在互联网上的其他地方找不到适用于该算法的好伪代码。我有一种感觉,这与我如何选择tau变量的符号有关,但我遵循课本上给我的伪代码。

我选择将此算法作为Fortran子程序编写,以准备即将对该材料进行的测试,目前,它只计算上三角矩阵,而不计算Q。以下是此算法给我的输出:

-18.7616634      -9.80723381      -15.7768545      -11.0864372    
0.00000000      -9.99090481      -9.33576298      -7.53412533    
0.00000000       0.00000000      -5.99453259      -9.80128098    
0.00000000       0.00000000       0.00000000     -0.512612820 

这是正确的输出:

18.7616634       9.80723286       15.7768517       11.0864372    
0.00000000       9.99090672       9.33576488       7.53412533    
0.00000000       0.00000000       5.99453354       9.80128098    
0.00000000       0.00000000       0.00000000      0.512614250

因此,这基本上只是一个迹象问题,因为价值观本身在其他方面是正确的。

! QR Decomposition with Householder reflections
! Takes a matrix square N x N matrix A
! upper triangular matrix R is stored in A
SUBROUTINE qrdcmp(A, N)
REAL, DIMENSION(10,10)  :: A, Q, I_N, uu
REAL gamma, tau, E
INTEGER N, & ! value of n for n x n matrix
I,J,K ! loop indices
E = EPSILON(E) ! smallest value recognized by compiler for real
! Identity matrix initialization
DO I=1,N
DO J=1,N
IF(I == J) THEN
I_N(I,J) = 1.0
ELSE
I_N(I,J) = 0.0
END IF
END DO
END DO

! Main loop
DO K=1,N
IF(ABS(MAXVAL(A(K:N,K))) < E .and. ABS(MINVAL(A(K:N,K))) < E) THEN
gamma = 0
ELSE
tau = 0
DO J=K,N
tau = tau + A(J,K)**2.0
END DO
tau = tau**(0.5) ! tau currently holds norm of the vector

IF(A(K,K) < 0) tau = -tau

A(K,K) = A(K,K) + tau
gamma = A(K,K)/tau

DO J=K+1,N
A(J,K) = A(J,K)/A(K,K)
END DO

A(K,K) = 1
END IF

DO I=K,N
DO J=K,N
uu(I,J) = gamma*A(I,K)*A(J,K)
END DO; END DO

Q(K:N,K:N) = -1*I_N(K:N,K:N) + uu(K:N,K:N)

A(K:N,K+1:N) = MATMUL(TRANSPOSE(Q(K:N,K:N)), A(K:N,K+1:N))
A(K,K) = -tau


END DO
END SUBROUTINE qrdcmp

如有任何见解,我们将不胜感激。此外,如果我的代码不能像它可能的那样容易阅读,我很抱歉

在构造反射器时,可以在当前列向量和相关的基向量之间选择两个平分线。这是在IF(A(K,K) < 0) tau = -tau行中完成的,正如您已经确定的那样"不幸的是";,避免取消问题的稳定选择,通常也会在R中产生符号翻转,正如您所观察到的。例如,对接近I的矩阵进行分解将产生接近Q,R = -I,-I的结果。如果您想要具有正对角线的R因子,则必须在完成分解后的额外步骤中将符号从R移动到Q

LAPACK在很短的一段时间内使用了默认产生正对角线的选项,这产生了一些奇怪的错误/数值稳定性问题,而以前没有。

最新更新