cmplxmat.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. //#include "stdafx.h"
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include "cmplxmat.h"
  5. /******************** constructors *************************/
  6. CmplxMatrix::CmplxMatrix(int dim1, int dim2, double a) {
  7. if (dim1 < 0 || dim2 < 0)
  8. cerr << "complex matrx: negative dimension." << endl;
  9. d_i = dim1;
  10. d_j = dim2;
  11. if (d_i > 0) {
  12. v = new CmplxVector*[d_i];
  13. for (int i = 0; i < d_i; i++) {
  14. v[i] = new CmplxVector(d_j);
  15. for(int j = 0; j < d_j; j++) elem(i,j) = a;
  16. }
  17. }
  18. else v = NULL;
  19. }
  20. CmplxMatrix::CmplxMatrix(int dim1, int dim2, Complex a) {
  21. if (dim1 < 0 || dim2 < 0)
  22. cerr << "complex matrx: negative dimension." << endl;
  23. d_i = dim1;
  24. d_j = dim2;
  25. if (d_i > 0) {
  26. v = new CmplxVector*[d_i];
  27. for (int i = 0; i < d_i; i++) {
  28. v[i] = new CmplxVector(d_j);
  29. for(int j = 0; j < d_j; j++) elem(i,j) = a;
  30. }
  31. }
  32. else v = NULL;
  33. }
  34. CmplxMatrix::CmplxMatrix(const CmplxMatrix& p) {
  35. d_i = p.d_i;
  36. d_j = p.d_j;
  37. if (d_i > 0) {
  38. v = new CmplxVector*[d_i];
  39. for (int i = 0; i < d_i; i++) v[i] = new CmplxVector(*p.v[i]);
  40. }
  41. else v = NULL;
  42. }
  43. CmplxMatrix::CmplxMatrix(const CmplxVector& vec) {
  44. d_i = vec.dim();
  45. d_j = 1;
  46. v = new CmplxVector*[d_i];
  47. for(int i = 0; i < d_i; i++) {
  48. v[i] = new CmplxVector(1);
  49. elem(i,0) = vec[i];
  50. }
  51. }
  52. CmplxMatrix::CmplxMatrix(const Matrix& p) {
  53. d_i = p.dim_i();
  54. d_j = p.dim_j();
  55. if (d_i > 0) {
  56. v = new CmplxVector*[d_i];
  57. for (int i = 0; i < d_i; i++) v[i] = new CmplxVector(p[i]);
  58. }
  59. else v = NULL;
  60. }
  61. CmplxMatrix::CmplxMatrix(const Vector& vec) {
  62. d_i = vec.dim();
  63. d_j = 1;
  64. v = new CmplxVector*[d_i];
  65. for(int i = 0; i < d_i; i++) {
  66. v[i] = new CmplxVector(1);
  67. elem(i,0) = Complex(vec[i],0.);
  68. }
  69. }
  70. CmplxMatrix::~CmplxMatrix()
  71. { if (v)
  72. { while(d_i--) delete v[d_i];
  73. delete v;
  74. }
  75. }
  76. /***************************** members ******************************/
  77. /******************************************
  78. void CmplxMatrix::free()
  79. {
  80. if (v) {
  81. while(d_i--) delete v[d_i];
  82. delete v;
  83. }
  84. }
  85. void CmplxMatrix::check_dimensions(const CmplxMatrix& mat) const {
  86. if (d_i != mat.d_i || d_j != mat.d_j) {
  87. cerr << "incompatible complex matrix types." << endl;
  88. exit(1);
  89. }
  90. }
  91. void CmplxMatrix::flip_rows(int i,int j) {
  92. CmplxVector* p = v[i];
  93. v[i] = v[j];
  94. v[j] = p;
  95. }
  96. *************************************/
  97. /*****************************************************
  98. CmplxMatrix& CmplxMatrix::operator=(const CmplxMatrix& mat) {
  99. int i, j;
  100. if (d_i != mat.d_i || d_j != mat.d_j) {
  101. for(i = 0; i < d_i; i++) delete v[i];
  102. delete v;
  103. d_i = mat.d_i;
  104. d_j = mat.d_j;
  105. v = new CmplxVector*[d_i];
  106. for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
  107. }
  108. for(i = 0; i < d_i; i++)
  109. for(j = 0; j < d_j; j++) elem(i,j) = mat.elem(i,j);
  110. return (*this);
  111. }
  112. CmplxMatrix& CmplxMatrix::operator=(const Matrix& mat) {
  113. int i, j;
  114. CmplxMatrix tmp(mat);
  115. if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
  116. for(i = 0; i < d_i; i++) delete v[i];
  117. delete v;
  118. d_i = mat.dim_i();
  119. d_j = mat.dim_j();
  120. v = new CmplxVector*[d_i];
  121. for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
  122. }
  123. for(i = 0; i < d_i; i++)
  124. for(j = 0; j < d_j; j++) elem(i,j) = tmp.elem(i,j);
  125. return (*this);
  126. }
  127. int CmplxMatrix::operator==(const CmplxMatrix& x) const {
  128. int i, j;
  129. if (d_i != x.d_i || d_j != x.d_j) return (0);
  130. for(i = 0; i < d_i; i++)
  131. for(j = 0; j < d_j; j++)
  132. if (elem(i,j) != x.elem(i,j)) return (0);
  133. return (1);
  134. }
  135. CmplxVector& CmplxMatrix::row(int i) const {
  136. if (i < 0 || i >= d_i) {
  137. cerr << "complex matrix: row index out of range" << endl;
  138. exit(1);
  139. }
  140. return (*v[i]);
  141. }
  142. Complex& CmplxMatrix::operator()(int i, int j) {
  143. if (i < 0 || i >= d_i) {
  144. cerr << "complex matrix: row index out of range" << endl;
  145. exit(1);
  146. }
  147. if (j < 0 || j >= d_j) {
  148. cerr << "complex matrix: col index out of range" << endl;
  149. exit(1);
  150. }
  151. return (elem(i,j));
  152. }
  153. Complex& CmplxMatrix::operator()(int i, int j) const {
  154. if (i < 0 || i >= d_i) {
  155. cerr << "complex matrix: row index out of range" << endl;
  156. exit(1);
  157. }
  158. if (j < 0 || j >= d_j) {
  159. cerr << "complex matrix: col index out of range" << endl;
  160. exit(1);
  161. }
  162. return (elem(i,j));
  163. }
  164. CmplxVector CmplxMatrix::col(int i) const {
  165. if (i < 0 || i >= d_j) {
  166. cerr << "complex matrix: col index out of range" << endl;
  167. exit(1);
  168. }
  169. CmplxVector result(d_i);
  170. int j = d_i;
  171. while (j--) result.v[j] = elem(j,i);
  172. return (result);
  173. }
  174. CmplxMatrix::operator CmplxVector() const {
  175. if (d_j != 1) {
  176. cerr << "error: cannot make complex vector from complex matrix" << endl;
  177. exit(1);
  178. }
  179. return (col(0));
  180. }
  181. CmplxMatrix CmplxMatrix::operator+(const CmplxMatrix& mat) {
  182. int i, j;
  183. check_dimensions(mat);
  184. CmplxMatrix result(d_i,d_j);
  185. for(i = 0; i < d_i; i++)
  186. for(j = 0; j < d_j; j++)
  187. result.elem(i,j) = elem(i,j) + mat.elem(i,j);
  188. return (result);
  189. }
  190. CmplxMatrix CmplxMatrix::operator+(const Matrix& mat) {
  191. int i, j;
  192. if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
  193. cerr << "incompatible complex matrix types. +" << endl;
  194. exit(1);
  195. }
  196. CmplxMatrix result(d_i,d_j);
  197. CmplxMatrix tmp(mat);
  198. for(i = 0; i < d_i; i++)
  199. for(j = 0; j < d_j; j++)
  200. result.elem(i,j) = elem(i,j) + tmp.elem(i,j);
  201. return (result);
  202. }
  203. CmplxMatrix CmplxMatrix::operator-(const CmplxMatrix& mat) {
  204. int i, j;
  205. check_dimensions(mat);
  206. CmplxMatrix result(d_i,d_j);
  207. for(i = 0; i < d_i; i++)
  208. for(j = 0; j < d_j; j++)
  209. result.elem(i,j) = elem(i,j) - mat.elem(i,j);
  210. return (result);
  211. }
  212. CmplxMatrix CmplxMatrix::operator-(const Matrix& mat) {
  213. int i, j;
  214. if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
  215. cerr << "incompatible complex matrix types in -." << endl;
  216. exit(1);
  217. }
  218. CmplxMatrix result(d_i,d_j);
  219. CmplxMatrix tmp(mat);
  220. for(i = 0; i < d_i; i++)
  221. for(j = 0; j < d_j; j++)
  222. result.elem(i,j) = elem(i,j) - tmp.elem(i,j);
  223. return (result);
  224. }
  225. CmplxMatrix& CmplxMatrix::operator+=(const CmplxMatrix& mat) {
  226. int i, j;
  227. check_dimensions(mat);
  228. for(i = 0; i < d_i; i++)
  229. for(j = 0; j < d_j; j++)
  230. elem(i,j) += mat.elem(i,j);
  231. return (*this);
  232. }
  233. CmplxMatrix& CmplxMatrix::operator-=(const CmplxMatrix& mat) {
  234. int i, j;
  235. check_dimensions(mat);
  236. for(i = 0; i < d_i; i++)
  237. for(j = 0; j < d_j; j++)
  238. elem(i,j) -= mat.elem(i,j);
  239. return (*this);
  240. }
  241. CmplxMatrix CmplxMatrix::operator-() {
  242. int i, j;
  243. CmplxMatrix result(d_i,d_j);
  244. for(i = 0; i < d_i; i++)
  245. for(j = 0; j < d_j; j++)
  246. result.elem(i,j) = -elem(i,j);
  247. return (result);
  248. }
  249. CmplxMatrix CmplxMatrix::operator*(double f) {
  250. int i, j;
  251. CmplxMatrix result(d_i,d_j);
  252. for(i = 0; i < d_i; i++)
  253. for(j = 0; j < d_j; j++)
  254. result.elem(i,j) = elem(i,j) * f;
  255. return (result);
  256. }
  257. CmplxMatrix CmplxMatrix::operator*(const Complex& f) {
  258. int i, j;
  259. CmplxMatrix result(d_i,d_j);
  260. for(i = 0; i < d_i; i++)
  261. for(j = 0; j < d_j; j++)
  262. result.elem(i,j) = elem(i,j) * f;
  263. return (result);
  264. }
  265. CmplxMatrix CmplxMatrix::operator*(const Matrix& mat) {
  266. if (d_j != mat.dim_i()) {
  267. cerr << "complex matrix: incompatible matrix types" << endl;
  268. exit(1);
  269. }
  270. CmplxMatrix result(d_i, mat.dim_j());
  271. int i, j;
  272. for(i = 0;i < mat.dim_j(); i++)
  273. for(j = 0; j < d_i; j++) result.elem(j,i) = *v[j] * mat.col(i);
  274. return (result);
  275. }
  276. CmplxMatrix CmplxMatrix::operator*(const CmplxMatrix& mat) {
  277. if (d_j != mat.d_i) {
  278. cerr << "complex matrix: incompatible matrix types" << endl;
  279. exit(1);
  280. }
  281. CmplxMatrix result(d_i, mat.d_j);
  282. int i,j;
  283. for(i = 0; i < mat.d_j; i++)
  284. for(j = 0; j < d_i; j++) result.elem(j,i) = *v[j] * mat.col(i);
  285. return (result);
  286. }
  287. CmplxMatrix CmplxMatrix::operator/(double a) {
  288. if (a==0) {
  289. cerr << "complex matrix: divided by zero" << endl;
  290. exit(1);
  291. }
  292. a = 1. / a;
  293. return (CmplxMatrix(*this * a));
  294. }
  295. CmplxMatrix CmplxMatrix::operator/(const Complex& a) {
  296. if (a==0) {
  297. cerr << "complex matrix: divided by zero" << endl;
  298. exit(1);
  299. }
  300. Complex tmp = 1. / a;
  301. return (CmplxMatrix(*this * a));
  302. }
  303. *******************************/
  304. CmplxMatrix CmplxMatrix::trans() const {
  305. CmplxMatrix result(d_j,d_i);
  306. for(int i = 0; i < d_j; i++)
  307. for(int j = 0; j < d_i; j++)
  308. result.elem(i,j) = elem(j,i);
  309. return (result);
  310. }
  311. Matrix CmplxMatrix::real() const {
  312. Matrix result(d_i,d_j);
  313. for(int i = 0; i < d_i; i++)
  314. for(int j = 0; j < d_j; j++)
  315. result(i,j)=::real(elem(i,j));
  316. return (result);
  317. }
  318. Matrix CmplxMatrix::imag() const {
  319. Matrix result(d_i,d_j);
  320. for(int i = 0; i < d_i; i++)
  321. for(int j = 0; j < d_j; j++)
  322. result(i,j)=::imag(elem(i,j));
  323. return (result);
  324. }
  325. Matrix CmplxMatrix::abs() const {
  326. Matrix result(d_i,d_j);
  327. for(int i = 0; i < d_i; i++)
  328. for(int j = 0; j < d_j; j++)
  329. result(i,j)=::cabs(elem(i,j));
  330. return (result);
  331. }
  332. CmplxMatrix CmplxMatrix::conjg() const {
  333. CmplxMatrix result(d_i,d_j);
  334. for(int i = 0; i < d_i; i++)
  335. for(int j = 0; j < d_j; j++)
  336. result(i,j)=::conjg(elem(i,j));
  337. return (result);
  338. }
  339. CmplxMatrix& CmplxMatrix::resize(int new_d_i, int new_d_j) {
  340. int i, j;
  341. if (d_i != new_d_i || d_j != new_d_j) {
  342. for(i = 0; i < d_i; i++) delete v[i];
  343. delete v;
  344. d_i = new_d_i;
  345. d_j = new_d_j;
  346. v = new CmplxVector*[d_i];
  347. for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
  348. }
  349. for(i = 0; i < d_i; i++)
  350. for(j = 0; j < d_j; j++) elem(i,j) = 0.0;
  351. return (*this);
  352. }
  353. /************************** friends ************************/
  354. ostream& operator<<(ostream& out, const CmplxMatrix& M) {
  355. //int i;
  356. //for (i = 0; i < M.d_i; i++) out << M[i] ;
  357. int i,j;
  358. for(j=0; j < M.d_j; j++)
  359. for(i=0; i < M.d_i; i++)
  360. out << " [" << i << "][" << j << "]=" << M[i][j] << endl;
  361. return (out);
  362. }
  363. istream& operator>>(istream& in, CmplxMatrix& M) {
  364. int i=0;
  365. while (i < M.d_i && in >> M[i++]);
  366. return (in);
  367. }