void Ricatti( Matrix<F>& W, Matrix<F>& X, SignCtrl<Base<F>> ctrl ) { DEBUG_ONLY(CallStackEntry cse("Ricatti")) Sign( W, ctrl ); const Int n = W.Height()/2; Matrix<F> WTL, WTR, WBL, WBR; PartitionDownDiagonal ( W, WTL, WTR, WBL, WBR, n ); // (ML, MR) = sgn(W) - I UpdateDiagonal( W, F(-1) ); // Solve for X in ML X = -MR Matrix<F> ML, MR; PartitionRight( W, ML, MR, n ); Scale( F(-1), MR ); LeastSquares( NORMAL, ML, MR, X ); }
inline ValueInt<BASE(F)> QDWHDivide ( UpperOrLower uplo, DistMatrix<F>& A, DistMatrix<F>& G, bool returnQ=false ) { DEBUG_ONLY(CallStackEntry cse("herm_eig::QDWHDivide")) // G := sgn(G) // G := 1/2 ( G + I ) herm_polar::QDWH( uplo, G ); UpdateDiagonal( G, F(1) ); Scale( F(1)/F(2), G ); // Compute the pivoted QR decomposition of the spectral projection const Grid& g = A.Grid(); DistMatrix<F,MD,STAR> t(g); DistMatrix<Int,VR,STAR> p(g); elem::QR( G, t, p ); // A := Q^H A Q MakeHermitian( uplo, A ); const Base<F> oneA = OneNorm( A ); if( returnQ ) { ExpandPackedReflectors( LOWER, VERTICAL, CONJUGATED, 0, G, t ); DistMatrix<F> B(g); Gemm( ADJOINT, NORMAL, F(1), G, A, B ); Gemm( NORMAL, NORMAL, F(1), B, G, A ); } else { qr::ApplyQ( LEFT, ADJOINT, G, t, A ); qr::ApplyQ( RIGHT, NORMAL, G, t, A ); } // Return || E21 ||1 / || A ||1 and the chosen rank auto part = ComputePartition( A ); part.value /= oneA; return part; }