inline void Trmv ( UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, const Matrix<T>& A, Matrix<T>& x ) { #ifndef RELEASE PushCallStack("Trmv"); if( x.Height() != 1 && x.Width() != 1 ) throw std::logic_error("x must be a vector"); if( A.Height() != A.Width() ) throw std::logic_error("A must be square"); const int xLength = ( x.Width()==1 ? x.Height() : x.Width() ); if( xLength != A.Height() ) throw std::logic_error("x must conform with A"); #endif const char uploChar = UpperOrLowerToChar( uplo ); const char transChar = OrientationToChar( orientation ); const char diagChar = UnitOrNonUnitToChar( diag ); const int m = A.Height(); const int incx = ( x.Width()==1 ? 1 : x.LDim() ); blas::Trmv ( uploChar, transChar, diagChar, m, A.LockedBuffer(), A.LDim(), x.Buffer(), incx ); #ifndef RELEASE PopCallStack(); #endif }
inline void Trmm ( LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, T alpha, const Matrix<T>& A, Matrix<T>& B ) { #ifndef RELEASE CallStackEntry entry("Trmm"); if( A.Height() != A.Width() ) LogicError("Triangular matrix must be square"); if( side == LEFT ) { if( A.Height() != B.Height() ) LogicError("Nonconformal Trmm"); } else { if( A.Height() != B.Width() ) LogicError("Nonconformal Trmm"); } #endif const char sideChar = LeftOrRightToChar( side ); const char uploChar = UpperOrLowerToChar( uplo ); const char transChar = OrientationToChar( orientation ); const char diagChar = UnitOrNonUnitToChar( diag ); blas::Trmm ( sideChar, uploChar, transChar, diagChar, B.Height(), B.Width(), alpha, A.LockedBuffer(), A.LDim(), B.Buffer(), B.LDim() ); }
inline void TriangularInverse ( UpperOrLower uplo, UnitOrNonUnit diag, Matrix<F>& A ) { #ifndef RELEASE PushCallStack("TriangularInverse"); if( A.Height() != A.Width() ) throw std::logic_error("A must be square"); #endif const char uploChar = UpperOrLowerToChar( uplo ); const char diagChar = UnitOrNonUnitToChar( diag ); lapack::TriangularInverse ( uploChar, diagChar, A.Height(), A.Buffer(), A.LDim() ); #ifndef RELEASE PopCallStack(); #endif }
inline void Trsm ( LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, F alpha, const Matrix<F>& A, Matrix<F>& B, bool checkIfSingular ) { #ifndef RELEASE PushCallStack("Trsm"); if( A.Height() != A.Width() ) throw std::logic_error("Triangular matrix must be square"); if( side == LEFT ) { if( A.Height() != B.Height() ) throw std::logic_error("Nonconformal Trsm"); } else { if( A.Height() != B.Width() ) throw std::logic_error("Nonconformal Trsm"); } #endif const char sideChar = LeftOrRightToChar( side ); const char uploChar = UpperOrLowerToChar( uplo ); const char transChar = OrientationToChar( orientation ); const char diagChar = UnitOrNonUnitToChar( diag ); if( checkIfSingular && diag != UNIT ) { const int n = A.Height(); for( int j=0; j<n; ++j ) if( A.Get(j,j) == F(0) ) throw SingularMatrixException(); } blas::Trsm ( sideChar, uploChar, transChar, diagChar, B.Height(), B.Width(), alpha, A.LockedBuffer(), A.LDim(), B.Buffer(), B.LDim() ); #ifndef RELEASE PopCallStack(); #endif }