123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- //#include "stdafx.h"
- #include <stdlib.h>
- #include <math.h>
- #include "cmplxmat.h"
- /******************** constructors *************************/
- CmplxMatrix::CmplxMatrix(int dim1, int dim2, double a) {
- if (dim1 < 0 || dim2 < 0)
- cerr << "complex matrx: negative dimension." << endl;
- d_i = dim1;
- d_j = dim2;
- if (d_i > 0) {
- v = new CmplxVector*[d_i];
- for (int i = 0; i < d_i; i++) {
- v[i] = new CmplxVector(d_j);
- for(int j = 0; j < d_j; j++) elem(i,j) = a;
- }
- }
- else v = NULL;
- }
- CmplxMatrix::CmplxMatrix(int dim1, int dim2, Complex a) {
- if (dim1 < 0 || dim2 < 0)
- cerr << "complex matrx: negative dimension." << endl;
- d_i = dim1;
- d_j = dim2;
- if (d_i > 0) {
- v = new CmplxVector*[d_i];
- for (int i = 0; i < d_i; i++) {
- v[i] = new CmplxVector(d_j);
- for(int j = 0; j < d_j; j++) elem(i,j) = a;
- }
- }
- else v = NULL;
- }
- CmplxMatrix::CmplxMatrix(const CmplxMatrix& p) {
-
- d_i = p.d_i;
- d_j = p.d_j;
- if (d_i > 0) {
- v = new CmplxVector*[d_i];
- for (int i = 0; i < d_i; i++) v[i] = new CmplxVector(*p.v[i]);
- }
- else v = NULL;
- }
- CmplxMatrix::CmplxMatrix(const CmplxVector& vec) {
-
- d_i = vec.dim();
- d_j = 1;
- v = new CmplxVector*[d_i];
- for(int i = 0; i < d_i; i++) {
- v[i] = new CmplxVector(1);
- elem(i,0) = vec[i];
- }
- }
- CmplxMatrix::CmplxMatrix(const Matrix& p) {
-
- d_i = p.dim_i();
- d_j = p.dim_j();
-
- if (d_i > 0) {
- v = new CmplxVector*[d_i];
- for (int i = 0; i < d_i; i++) v[i] = new CmplxVector(p[i]);
- }
- else v = NULL;
- }
- CmplxMatrix::CmplxMatrix(const Vector& vec) {
-
- d_i = vec.dim();
- d_j = 1;
- v = new CmplxVector*[d_i];
- for(int i = 0; i < d_i; i++) {
- v[i] = new CmplxVector(1);
- elem(i,0) = Complex(vec[i],0.);
- }
- }
- CmplxMatrix::~CmplxMatrix()
- { if (v)
- { while(d_i--) delete v[d_i];
- delete v;
- }
- }
- /***************************** members ******************************/
- /******************************************
- void CmplxMatrix::free()
- {
- if (v) {
- while(d_i--) delete v[d_i];
- delete v;
- }
- }
- void CmplxMatrix::check_dimensions(const CmplxMatrix& mat) const {
- if (d_i != mat.d_i || d_j != mat.d_j) {
- cerr << "incompatible complex matrix types." << endl;
- exit(1);
- }
- }
- void CmplxMatrix::flip_rows(int i,int j) {
-
- CmplxVector* p = v[i];
- v[i] = v[j];
- v[j] = p;
- }
- *************************************/
- /*****************************************************
- CmplxMatrix& CmplxMatrix::operator=(const CmplxMatrix& mat) {
-
- int i, j;
- if (d_i != mat.d_i || d_j != mat.d_j) {
- for(i = 0; i < d_i; i++) delete v[i];
- delete v;
- d_i = mat.d_i;
- d_j = mat.d_j;
- v = new CmplxVector*[d_i];
- for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
- }
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++) elem(i,j) = mat.elem(i,j);
- return (*this);
- }
- CmplxMatrix& CmplxMatrix::operator=(const Matrix& mat) {
-
- int i, j;
- CmplxMatrix tmp(mat);
- if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
- for(i = 0; i < d_i; i++) delete v[i];
- delete v;
- d_i = mat.dim_i();
- d_j = mat.dim_j();
- v = new CmplxVector*[d_i];
- for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
- }
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++) elem(i,j) = tmp.elem(i,j);
- return (*this);
- }
- int CmplxMatrix::operator==(const CmplxMatrix& x) const {
- int i, j;
- if (d_i != x.d_i || d_j != x.d_j) return (0);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- if (elem(i,j) != x.elem(i,j)) return (0);
- return (1);
- }
- CmplxVector& CmplxMatrix::row(int i) const {
- if (i < 0 || i >= d_i) {
- cerr << "complex matrix: row index out of range" << endl;
- exit(1);
- }
- return (*v[i]);
- }
- Complex& CmplxMatrix::operator()(int i, int j) {
- if (i < 0 || i >= d_i) {
- cerr << "complex matrix: row index out of range" << endl;
- exit(1);
- }
- if (j < 0 || j >= d_j) {
- cerr << "complex matrix: col index out of range" << endl;
- exit(1);
- }
- return (elem(i,j));
- }
- Complex& CmplxMatrix::operator()(int i, int j) const {
- if (i < 0 || i >= d_i) {
- cerr << "complex matrix: row index out of range" << endl;
- exit(1);
- }
- if (j < 0 || j >= d_j) {
- cerr << "complex matrix: col index out of range" << endl;
- exit(1);
- }
- return (elem(i,j));
- }
- CmplxVector CmplxMatrix::col(int i) const {
-
- if (i < 0 || i >= d_j) {
- cerr << "complex matrix: col index out of range" << endl;
- exit(1);
- }
- CmplxVector result(d_i);
- int j = d_i;
- while (j--) result.v[j] = elem(j,i);
- return (result);
- }
- CmplxMatrix::operator CmplxVector() const {
- if (d_j != 1) {
- cerr << "error: cannot make complex vector from complex matrix" << endl;
- exit(1);
- }
- return (col(0));
- }
- CmplxMatrix CmplxMatrix::operator+(const CmplxMatrix& mat) {
- int i, j;
- check_dimensions(mat);
- CmplxMatrix result(d_i,d_j);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) + mat.elem(i,j);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator+(const Matrix& mat) {
- int i, j;
- if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
- cerr << "incompatible complex matrix types. +" << endl;
- exit(1);
- }
- CmplxMatrix result(d_i,d_j);
- CmplxMatrix tmp(mat);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) + tmp.elem(i,j);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator-(const CmplxMatrix& mat) {
- int i, j;
- check_dimensions(mat);
- CmplxMatrix result(d_i,d_j);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) - mat.elem(i,j);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator-(const Matrix& mat) {
- int i, j;
- if (d_i != mat.dim_i() || d_j != mat.dim_j()) {
- cerr << "incompatible complex matrix types in -." << endl;
- exit(1);
- }
- CmplxMatrix result(d_i,d_j);
- CmplxMatrix tmp(mat);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) - tmp.elem(i,j);
- return (result);
- }
- CmplxMatrix& CmplxMatrix::operator+=(const CmplxMatrix& mat) {
- int i, j;
- check_dimensions(mat);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- elem(i,j) += mat.elem(i,j);
- return (*this);
- }
- CmplxMatrix& CmplxMatrix::operator-=(const CmplxMatrix& mat) {
- int i, j;
- check_dimensions(mat);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- elem(i,j) -= mat.elem(i,j);
- return (*this);
- }
- CmplxMatrix CmplxMatrix::operator-() {
- int i, j;
- CmplxMatrix result(d_i,d_j);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = -elem(i,j);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator*(double f) {
- int i, j;
- CmplxMatrix result(d_i,d_j);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) * f;
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator*(const Complex& f) {
- int i, j;
- CmplxMatrix result(d_i,d_j);
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++)
- result.elem(i,j) = elem(i,j) * f;
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator*(const Matrix& mat) {
- if (d_j != mat.dim_i()) {
- cerr << "complex matrix: incompatible matrix types" << endl;
- exit(1);
- }
- CmplxMatrix result(d_i, mat.dim_j());
- int i, j;
- for(i = 0;i < mat.dim_j(); i++)
- for(j = 0; j < d_i; j++) result.elem(j,i) = *v[j] * mat.col(i);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator*(const CmplxMatrix& mat) {
- if (d_j != mat.d_i) {
- cerr << "complex matrix: incompatible matrix types" << endl;
- exit(1);
- }
- CmplxMatrix result(d_i, mat.d_j);
- int i,j;
- for(i = 0; i < mat.d_j; i++)
- for(j = 0; j < d_i; j++) result.elem(j,i) = *v[j] * mat.col(i);
- return (result);
- }
- CmplxMatrix CmplxMatrix::operator/(double a) {
-
- if (a==0) {
- cerr << "complex matrix: divided by zero" << endl;
- exit(1);
- }
- a = 1. / a;
- return (CmplxMatrix(*this * a));
- }
- CmplxMatrix CmplxMatrix::operator/(const Complex& a) {
- if (a==0) {
- cerr << "complex matrix: divided by zero" << endl;
- exit(1);
- }
- Complex tmp = 1. / a;
- return (CmplxMatrix(*this * a));
- }
- *******************************/
- CmplxMatrix CmplxMatrix::trans() const {
- CmplxMatrix result(d_j,d_i);
- for(int i = 0; i < d_j; i++)
- for(int j = 0; j < d_i; j++)
- result.elem(i,j) = elem(j,i);
- return (result);
- }
- Matrix CmplxMatrix::real() const {
- Matrix result(d_i,d_j);
- for(int i = 0; i < d_i; i++)
- for(int j = 0; j < d_j; j++)
- result(i,j)=::real(elem(i,j));
- return (result);
- }
- Matrix CmplxMatrix::imag() const {
- Matrix result(d_i,d_j);
- for(int i = 0; i < d_i; i++)
- for(int j = 0; j < d_j; j++)
- result(i,j)=::imag(elem(i,j));
- return (result);
- }
- Matrix CmplxMatrix::abs() const {
- Matrix result(d_i,d_j);
- for(int i = 0; i < d_i; i++)
- for(int j = 0; j < d_j; j++)
- result(i,j)=::cabs(elem(i,j));
- return (result);
- }
- CmplxMatrix CmplxMatrix::conjg() const {
- CmplxMatrix result(d_i,d_j);
- for(int i = 0; i < d_i; i++)
- for(int j = 0; j < d_j; j++)
- result(i,j)=::conjg(elem(i,j));
- return (result);
- }
-
- CmplxMatrix& CmplxMatrix::resize(int new_d_i, int new_d_j) {
- int i, j;
- if (d_i != new_d_i || d_j != new_d_j) {
- for(i = 0; i < d_i; i++) delete v[i];
- delete v;
- d_i = new_d_i;
- d_j = new_d_j;
- v = new CmplxVector*[d_i];
- for(i = 0; i < d_i; i++) v[i] = new CmplxVector(d_j);
- }
- for(i = 0; i < d_i; i++)
- for(j = 0; j < d_j; j++) elem(i,j) = 0.0;
- return (*this);
- }
- /************************** friends ************************/
- ostream& operator<<(ostream& out, const CmplxMatrix& M) {
- //int i;
- //for (i = 0; i < M.d_i; i++) out << M[i] ;
- int i,j;
- for(j=0; j < M.d_j; j++)
- for(i=0; i < M.d_i; i++)
- out << " [" << i << "][" << j << "]=" << M[i][j] << endl;
-
- return (out);
- }
- istream& operator>>(istream& in, CmplxMatrix& M) {
- int i=0;
- while (i < M.d_i && in >> M[i++]);
- return (in);
- }
|