00001
00003 inline _zgematrix t(const _zgematrix& mat)
00004 {
00005 #ifdef CPPL_VERBOSE
00006 std::cerr << "# [MARK] t(const _zgematrix&)"
00007 << std::endl;
00008 #endif//CPPL_VERBOSE
00009
00010 zgematrix newmat(mat.N,mat.M);
00011
00012 for(long i=0; i<newmat.m; i++){
00013 for(long j=0; j<newmat.n; j++){
00014 newmat(i,j) =mat(j,i);
00015 }
00016 }
00017
00018 mat.destroy();
00019 return _(newmat);
00020 }
00021
00022
00024 inline _zgematrix i(const _zgematrix& mat)
00025 {
00026 #ifdef CPPL_VERBOSE
00027 std::cerr << "# [MARK] i(const _zgematrix&)"
00028 << std::endl;
00029 #endif//CPPL_VERBOSE
00030
00031 #ifdef CPPL_DEBUG
00032 if(mat.M!=mat.N){
00033 std::cerr << "[ERROR] t(_zgematrix&) " << std::endl
00034 << "This matrix is not square and has no inverse matrix."
00035 << std::endl
00036 << "Your input was (" << mat.M << "x" << mat.N << ")."
00037 << std::endl;
00038 exit(1);
00039 }
00040 #endif//CPPL_DEBUG
00041 zgematrix mat_cp;
00042 mat_cp.shallow_copy(mat);
00043
00044 zgematrix mat_inv(mat.M,mat.N);
00045 mat_inv.identity();
00046
00047 mat_cp.zgesv(mat_inv);
00048
00049 return _(mat_inv);
00050 }
00051
00055
00056
00058 inline _zgematrix conj(const _zgematrix& mat)
00059 {
00060 #ifdef CPPL_VERBOSE
00061 std::cerr << "# [MARK] conj(const _zgematrix&)"
00062 << std::endl;
00063 #endif//CPPL_VERBOSE
00064
00065 for(long i=0; i<mat.M; i++){ for(long j=0; j<mat.N; j++){
00066 mat(i,j) =std::conj(mat(i,j));
00067 }}
00068
00069 return mat;
00070 }
00071
00072
00074 inline _zgematrix conjt(const _zgematrix& mat)
00075 {
00076 #ifdef CPPL_VERBOSE
00077 std::cerr << "# [MARK] conjt(const _zgematrix&)"
00078 << std::endl;
00079 #endif//CPPL_VERBOSE
00080
00081 zgematrix newmat(mat.N,mat.M);
00082 for(long i=0; i<newmat.m; i++){
00083 for(long j=0; j<newmat.n; j++){
00084 newmat(i,j) =std::conj(mat(j,i));
00085 }
00086 }
00087
00088 mat.destroy();
00089 return _(newmat);
00090 }
00091
00095
00096
00099 inline void idamax(long& i, long& j, const _zgematrix& mat)
00100 {
00101 #ifdef CPPL_VERBOSE
00102 std::cerr << "# [MARK] idamax(long&, long&, const _zgematrix&)"
00103 << std::endl;
00104 #endif//CPPL_VERBOSE
00105
00106 long index( izamax_(mat.M*mat.N, mat.Array, 1) -1 );
00107 i =index%mat.M;
00108 j =index/mat.M;
00109
00110 mat.destroy();
00111 }
00112
00113
00115 inline std::complex<double> damax(const _zgematrix& mat)
00116 {
00117 #ifdef CPPL_VERBOSE
00118 std::cerr << "# [MARK] damax(const _zgematrix&)"
00119 << std::endl;
00120 #endif//CPPL_VERBOSE
00121
00122 std::complex<double> val( mat.Array[izamax_(mat.M*mat.N, mat.Array, 1) -1] );
00123
00124 mat.destroy();
00125 return val;
00126 }