QDWHInfo QDWH ( AbstractDistMatrix<F>& APre, AbstractDistMatrix<F>& PPre, const QDWHCtrl& ctrl ) { EL_DEBUG_CSE DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre ); DistMatrixWriteProxy<F,F,MC,MR> PProx( PPre ); auto& A = AProx.Get(); auto& P = PProx.Get(); DistMatrix<F> ACopy( A ); auto info = QDWH( A, ctrl ); Zeros( P, A.Height(), A.Height() ); Trrk( LOWER, NORMAL, NORMAL, F(1), A, ACopy, F(0), P ); MakeHermitian( LOWER, P ); return info; }
void SVD( ElementalMatrix<F>& APre, ElementalMatrix<F>& PPre ) { DEBUG_CSE typedef Base<F> Real; DistMatrixReadWriteProxy<F,F,MC,MR> AProx( APre ); DistMatrixWriteProxy<F,F,MC,MR> PProx( PPre ); auto& A = AProx.Get(); auto& P = PProx.Get(); const Grid& g = A.Grid(); // Get the SVD of A DistMatrix<Real,VR,STAR> s(g); DistMatrix<F> U(g), V(g); SVDCtrl<Real> ctrl; ctrl.overwrite = true; El::SVD( A, U, s, V, ctrl ); // Form Q := U V^H in A Gemm( NORMAL, ADJOINT, F(1), U, V, A ); // Form P := V Sigma V^H in P HermitianFromEVD( LOWER, P, s, V ); }