/* Example programs from the book Scientific and Engineering Programming in C++: An Introduction with Advanced Techniques and Examples, Addison-Wesley, 1994. (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 1994. ALL RIGHTS RESERVED. See README file for further details. */ template TransposedConcreteBlas2d::TransposedConcreteBlas2d(ConcreteBlas2d& a) : ConcreteArray2dRef, T>( SubscriptArray<2>(a.shape(1), a.shape(0)), // Subscriptor initializer a.firstDatum() ) { } template TransposedConcreteBlas2d::operator ConcreteBlas2d() const { ConcreteBlas2d result(shape(1), shape(0)); concreteCopy(result, ConcreteArray2dConstRef(*this)); return result; } template ConcreteBlas2d operator*(const TransposedConcreteBlas2d& t, const TransposedConcreteBlas2d& u ) { ConcreteBlas2d result(t.shape(0), u.shape(1)); Blas3Subroutines::xgemm( Blas3Subroutines::trans, Blas3Subroutines::trans, t.shape(0), u.shape(1), t.shape(1), T(1), t.firstDatum(), t.shape(1), u.firstDatum(), u.shape(1), T(0), result.firstDatum(), result.shape(0) ); return result; } template ConcreteBlas2d operator*(const ConcreteBlas2d& u, const TransposedConcreteBlas2d& t) { ConcreteBlas2d result(u.shape(0), t.shape(1)); Blas3Subroutines::xgemm( Blas3Subroutines::no_trans, Blas3Subroutines::trans, u.shape(0), t.shape(1), u.shape(1), T(1), u.firstDatum(), u.shape(0), t.firstDatum(), t.shape(1), T(0), result.firstDatum(), result.shape(0) ); return result; } template ConcreteBlas2d operator*(const TransposedConcreteBlas2d& t, const ConcreteBlas2d& u){ ConcreteBlas2d result(t.shape(0), u.shape(1)); Blas3Subroutines::xgemm( Blas3Subroutines::trans, Blas3Subroutines::no_trans, t.shape(0), u.shape(1), t.shape(1), T(1), t.firstDatum(), t.shape(1), u.firstDatum(), u.shape(0), T(0), result.firstDatum(), result.shape(0) ); return result; } template ConcreteBlas1d operator*(const TransposedConcreteBlas2d& t, const ConcreteBlas1d& u){ ConcreteBlas1d result( t.shape(0) ); Blas3Subroutines::xgemv( Blas3Subroutines::trans, t.shape(1), t.shape(0), T(1), t.firstDatum(), t.shape(1), u.firstDatum(), 1, T(0), result.firstDatum(), 1 ); return result; }