diff --git a/nonclass.h b/nonclass.h index 00e3811..b09c7bf 100644 --- a/nonclass.h +++ b/nonclass.h @@ -68,22 +68,43 @@ return positive_power(z,i); template -const NRSMat twoside_transform(const NRSMat &S, const NRMat &C, bool transp=0) //calculate C^dagger S C +const NRSMat twoside_transform(const NRSMat &S, const NRMat &C, bool transp=0) //calculate C^dagger S C for symmetric/hermitian S { +char tchar='t'; +if(LA_traits::is_complex()) tchar='c'; if(transp) { NRMat tmp = C * S; NRMat result(C.nrows(),C.nrows()); - result.gemm((T)0,tmp,'n',C,'t',(T)1); + result.gemm((T)0,tmp,'n',C,tchar,(T)1); return NRSMat(result); } NRMat tmp = S * C; NRMat result(C.ncols(),C.ncols()); -result.gemm((T)0,C,'t',tmp,'n',(T)1); +result.gemm((T)0,C,tchar,tmp,'n',(T)1); return NRSMat(result); } +template +const NRMat twoside_transform(const NRMat &S, const NRMat &C, bool transp=0) //calculate C^dagger S C for non-symmetric S +{ +char tchar='t'; +if(LA_traits::is_complex()) tchar='c'; +if(transp) + { + NRMat tmp = C * S; + NRMat result(C.nrows(),C.nrows()); + result.gemm((T)0,tmp,'n',C,tchar,(T)1); + return result; + } +NRMat tmp = S * C; +NRMat result(C.ncols(),C.ncols()); +result.gemm((T)0,C,tchar,tmp,'n',(T)1); +return result; +} + + template