inline void Householder( Matrix<F>& A, Matrix<F>& t ) { #ifndef RELEASE CallStackEntry entry("rq::Householder"); #endif t.ResizeTo( Min(A.Height(),A.Width()), 1 ); // Matrix views Matrix<F> ATL, ATR, A00, A01, A02, ATopPan, ABL, ABR, A10, A11, A12, ABottomPan, A20, A21, A22; Matrix<F> tT, t0, tB, t1, t2; PartitionUpOffsetDiagonal ( A.Width()-A.Height(), A, ATL, ATR, ABL, ABR, 0 ); PartitionUp ( t, tT, tB, 0 ); while( ABR.Height() < A.Height() && ABR.Width() < A.Width() ) { RepartitionUpDiagonal ( ATL, /**/ ATR, A00, A01, /**/ A02, /**/ A10, A11, /**/ A12, /*************/ /******************/ ABL, /**/ ABR, A20, A21, /**/ A22 ); RepartitionUp ( tT, t0, t1, /**/ /**/ tB, t2 ); View1x2( ATopPan, A00, A01 ); View1x2( ABottomPan, A10, A11 ); //--------------------------------------------------------------------// PanelHouseholder( ABottomPan, t1 ); ApplyQ( RIGHT, ADJOINT, ABottomPan, t1, ATopPan ); //--------------------------------------------------------------------// SlidePartitionUp ( tT, t0, /**/ /**/ t1, tB, t2 ); SlidePartitionUpDiagonal ( ATL, /**/ ATR, A00, /**/ A01, A02, /*************/ /******************/ /**/ A10, /**/ A11, A12, ABL, /**/ ABR, A20, /**/ A21, A22 ); } }
inline void RepartitionUpDiagonal ( DM& ATL, DM& ATR, DM& A00, DM& A01, DM& A02, DM& A10, DM& A11, DM& A12, DM& ABL, DM& ABR, DM& A20, DM& A21, DM& A22, Int bsize=Blocksize() ) { DEBUG_ONLY(CallStackEntry cse("RepartitionUpDiagonal")) PartitionUpOffsetDiagonal ( ATL.Width()-ATL.Height(), ATL, A00, A01, A10, A11, bsize ); PartitionUp( ATR, A02, A12, A11.Height() ); PartitionLeft( ABL, A20, A21, A11.Width() ); View( A22, ABR ); }
inline void RepartitionUpDiagonal ( DM& ATL, DM& ATR, DM& A00, DM& A01, DM& A02, DM& A10, DM& A11, DM& A12, DM& ABL, DM& ABR, DM& A20, DM& A21, DM& A22, Int bsize ) { #ifndef RELEASE CallStackEntry cse("RepartitionUpDiagonal [DistMatrix]"); #endif PartitionUpOffsetDiagonal ( ATL.Width()-ATL.Height(), ATL, A00, A01, A10, A11, bsize ); PartitionUp( ATR, A02, A12, A11.Height() ); PartitionLeft( ABL, A20, A21, A11.Width() ); View( A22, ABR ); }
inline void Householder( DistMatrix<F>& A, DistMatrix<F,MD,STAR>& t ) { #ifndef RELEASE CallStackEntry entry("rq::Householder"); if( A.Grid() != t.Grid() ) LogicError("{A,s} must be distributed over the same grid"); #endif const Int offset = A.Width()-A.Height(); if( t.Viewing() ) { if( !t.AlignedWithDiagonal( A, offset ) ) LogicError("t was not aligned with A"); } else { t.AlignWithDiagonal( A, offset ); } t.ResizeTo( Min(A.Height(),A.Width()), 1 ); // Matrix views const Grid& g = A.Grid(); DistMatrix<F> ATL(g), ATR(g), A00(g), A01(g), A02(g), ATopPan(g), ABL(g), ABR(g), A10(g), A11(g), A12(g), ABottomPan(g), A20(g), A21(g), A22(g); DistMatrix<F,MD,STAR> tT(g), t0(g), tB(g), t1(g), t2(g); PartitionUpOffsetDiagonal ( offset, A, ATL, ATR, ABL, ABR, 0 ); PartitionUp ( t, tT, tB, 0 ); while( ABR.Height() < A.Height() && ABR.Width() < A.Width() ) { RepartitionUpDiagonal ( ATL, /**/ ATR, A00, A01, /**/ A02, /**/ A10, A11, /**/ A12, /*************/ /******************/ ABL, /**/ ABR, A20, A21, /**/ A22 ); RepartitionUp ( tT, t0, t1, /**/ /**/ tB, t2 ); View1x2( ATopPan, A00, A01 ); View1x2( ABottomPan, A10, A11 ); //--------------------------------------------------------------------// PanelHouseholder( ABottomPan, t1 ); ApplyQ( RIGHT, ADJOINT, ABottomPan, t1, ATopPan ); //--------------------------------------------------------------------// SlidePartitionUp ( tT, t0, /**/ /**/ t1, tB, t2 ); SlidePartitionUpDiagonal ( ATL, /**/ ATR, A00, /**/ A01, A02, /*************/ /******************/ /**/ A10, /**/ A11, A12, ABL, /**/ ABR, A20, /**/ A21, A22 ); } }