⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.h

📁 矩阵运算的模板类
💻 H
📖 第 1 页 / 共 5 页
字号:
// constructor and destructor/////////////////////////////template <typename T> Matrix<T>::Matrix(int m_, int n_, const T& v_) : m(m_), n(n_) {	int i;	mat.Resize(m);	for(i=1;i<=m;i++) { mat[i].SetType(ROW_VECTOR); mat[i].Resize(n); }	for(i=1;i<=m;i++) for(int j=1;j<=n;j++)  mat[i][j]=v_;}template <typename T> Matrix<T>::Matrix(int m_, int n_, const char* v_) : m(m_), n(n_) {	int i,k;	mat.Resize(m);	for(i=1;i<=m;i++) { mat[i].SetType(ROW_VECTOR); mat[i].Resize(n); }	Vector<string> num=mtl_split(v_);	for(i=1,k=1;i<=m;i++) for(int j=1;j<=n;j++) {		if(k<=num.Size()) { mat[i][j]=T(atof(num[k].c_str())); k++; }		else mat[i][j]=T();	}}template <typename T> Matrix<T>::Matrix(const Vector<T>& v_, int m_, int n_) : m(m_), n(n_) {	int i,k;	mat.Resize(m);	for(i=1;i<=m;i++) { mat[i].SetType(ROW_VECTOR); mat[i].Resize(n); }	for(i=1,k=1;i<=m;i++) for(int j=1;j<=n;j++) {		if(k<=v_.Size()) { mat[i][j]=v_[k]; k++; }		else mat[i][j]=T();	}}//template <typename T> inline Matrix<T>::Matrix(const Matrix<T>& A) : mat(A.mat),m(A.m),n(A.n) {//}template <typename T> inline Matrix<T>::~Matrix() {}/////////////////////////////// operator overloading///////////////////////////////template <typename T> inline Matrix<T>& Matrix<T>::operator=(const Matrix<T>& A) {//	if(this == &A) return *this;//	if ( A.n != n || A.m != m) Resize(A.m, A.n);//	mat = A.mat;//	return *this;//}template <typename T> Matrix<T>& Matrix<T>::operator=(const T& a) {	for(int i=1; i<=m; ++i) for(int j=1;j<=n; ++j) mat[i][j] = a;	return *this;}#ifdef ALLOW_ACCESS_BY_BRACKETtemplate <typename T> inline Vector<T>& Matrix<T>::operator[](int i) { 	return mat[i]; }template <typename T> inline const Vector<T>& Matrix<T>::operator[](int i) const { 	return mat[i]; }#endiftemplate <typename T> inline Vector<T>& Matrix<T>::operator()(int i) {	return mat(i); }template <typename T> inline const Vector<T>& Matrix<T>::operator()(int i) const {	return mat(i); }template <typename T> inline T& Matrix<T>::operator()(int i, int j) {	return (mat(i))(j); }template <typename T> inline const T& Matrix<T>::operator()(int i, int j) const {	return (mat(i))(j); }template <typename T> inline Matrix<T> Matrix<T>::operator+() {	return (*this);}template <typename T> Matrix<T> Matrix<T>::operator-() {	Matrix<T> C=(*this);	C*=(-1);	return C;}template <typename T> Matrix<T>& Matrix<T>::operator+=(const Matrix<T>& B) {	assert(m == B.m && n == B.n);	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]+=B.mat[i][j];	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator-=(const Matrix<T>& B) {	assert(m == B.m && n == B.n);	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]-=B.mat[i][j];	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator+=(const double b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]+=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator-=(const double b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]-=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator*=(const double b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]*=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator/=(const double b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]/=b;	return (*this);}#ifndef DISABLE_COMPLEXtemplate <typename T> Matrix<T>& Matrix<T>::operator+=(const complex<T> b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]+=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator-=(const complex<T> b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]-=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator*=(const complex<T> b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]*=b;	return (*this);}template <typename T> Matrix<T>& Matrix<T>::operator/=(const complex<T> b) {	for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) mat[i][j]/=b;	return (*this);}#endif/////////////////////////////// friend operator overloading/////////////////////////////template <typename T> inline Matrix<T> mtl_plus(const Matrix<T>& A, const Matrix<T>& B) {	Matrix<T> C=A; C+=B; return C;}template <typename T> inline Matrix<T> mtl_minus(const Matrix<T>& A, const Matrix<T>& B) {	Matrix<T> C=A; C-=B; return C;}template <typename T> inline Matrix<T> mtl_plus(const Matrix<T>& A, const double b) {	Matrix<T> C=A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_minus(const Matrix<T>& A, const double b) {	Matrix<T> C=A; C-=b; return C;}template <typename T> inline Matrix<T> mtl_times(const Matrix<T>& A, const double b) {	Matrix<T> C=A; C*=b; return C;}template <typename T> inline Matrix<T> mtl_divide(const Matrix<T>& A, const double b) {	Matrix<T> C=A; C/=b; return C;}template <typename T> inline Matrix<T> mtl_plus(const double b, const Matrix<T>& A) {	Matrix<T> C=A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_minus(const double b, const Matrix<T>& A) {	Matrix<T> C=-A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_times(const double b, const Matrix<T>& A) {	Matrix<T> C=A; C*=b; return C;}template <typename T> Matrix<T> mtl_divide(const double b, const Matrix<T>& A) {	Matrix<T> C(A.m,A.n);	for(int i=1;i<=C.m;i++) for(int j=1;C.n;j++)		C.mat[i][j]=b/A.mat[i][j];	return C;}// Multiply Matrix * Matrixtemplate <typename T> Matrix<T> mtl_mtimes(const Matrix<T>& A, const Matrix<T>& B) {	assert(A.n == B.m);	Matrix<T> C(A.m, B.n);	for(int i=1;i<=A.m;i++) {		for(int j=1;j<=B.n;j++){			T sum=T();			for(int k=1;k<=A.n;k++)				sum+=A.mat[i][k]*B.mat[k][j];			C.mat[i][j]=sum;		}	}	return C;}#ifndef DISABLE_COMPLEXtemplate <typename T> inline Matrix<T> mtl_plus(const Matrix<T>& A, const complex<T> b) {	Matrix<T> C=A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_minus(const Matrix<T>& A, const complex<T> b) {	Matrix<T> C=A; C-=b; return C;}template <typename T> inline Matrix<T> mtl_times(const Matrix<T>& A, const complex<T> b) {	Matrix<T> C=A; C*=b; return C;}template <typename T> inline Matrix<T> mtl_divide(const Matrix<T>& A, const complex<T> b) {	Matrix<T> C=A; C/=b; return C;}template <typename T> inline Matrix<T> mtl_plus(const complex<T> b, const Matrix<T>& A) {	Matrix<T> C=A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_minus(const complex<T> b, const Matrix<T>& A) {	Matrix<T> C=-A; C+=b; return C;}template <typename T> inline Matrix<T> mtl_times(const complex<T> b, const Matrix<T>& A) {	Matrix<T> C=A; C*=b; return C;}#endif// Multiply Matrix*Vector'template <typename T> Vector<T> mtl_mvtimes(const Matrix<T>& M, const Vector<T>& V) {	assert(V.Type() == COL_VECTOR);	assert(V.Size() == M.n); 	Vector<T> C(M.m,COL_VECTOR);	for(int i=1; i<=M.m; ++i) {		T sum = 0;		for(int k=1; k<=M.n; ++k) sum += M.mat[i][k] * V[k];		C[i] = sum;	}	return C;}// Multiply Vector*Matrixtemplate <typename T> Vector<T> mtl_vmtimes(const Vector<T>& V, const Matrix<T>& M) {	assert(V.Type() == ROW_VECTOR);	assert(V.Size() == M.m); 	Vector<T> C(M.n,ROW_VECTOR);	for(int j=1; j<=M.n; ++j) {		T sum = 0;		for(int k=1; k<=M.m; ++k) sum += V[k] * M.mat[k][j];		C[j] = sum;	}	return C;}// Array Multiplytemplate <typename T> Matrix<T>  mtl_times(const Matrix<T>& A, const Matrix<T>& B){	assert(A.m==B.m && A.n==B.n);	Matrix<T> C(A.m,A.n);	for(int i=1;i<=A.m;i++)		for(int j=1;j<=A.n;j++) C.mat[i][j]=A.mat[i][j]*B.mat[i][j];	return C;}// Array right Division A(i,j)/B(i,j)template <typename T> Matrix<T>  mtl_rdivide(const Matrix<T>& A, const Matrix<T>& B){	assert(A.m==B.m && A.n==B.n);	Matrix<T> C(A.m,A.n);	for(int i=1;i<=A.m;i++)		for(int j=1;j<=A.n;j++) C.mat[i][j]=A.mat[i][j]/B.mat[i][j];	return C;}// Array left Division B(i,j)/A(i,j)template <typename T> Matrix<T>  mtl_ldivide(const Matrix<T>& A, const Matrix<T>& B){	assert(A.m==B.m && A.n==B.n);	Matrix<T> C(A.m,A.n);	for(int i=1;i<=A.m;i++)		for(int j=1;j<=A.n;j++) C.mat[i][j]=B.mat[i][j]/A.mat[i][j];	return C;}// Matrix right Division A\B = pinv(A)*btemplate <typename T> Matrix<T>  mtl_mldivide(const Matrix<T>& A, const Matrix<T>& B){	Matrix<T> C(A.n,B.n);	Vector<T> b(B.m),x(A.n);	for(int j=1;j<=B.n;j++){		b=B.Col(j);		int isOK=Solve(A,b,x);		C.SetCol(j,x);	}	return C;}// Matrix left Division A/B = A*inv(B). More precisely, A/B = (B'\A')'template <typename T> Matrix<T>  mtl_mrdivide(const Matrix<T>& A, const Matrix<T>& B){	return Transpose(mtl_mldivide(Transpose(B),Transpose(A)));}template <typename T> Matrix<T> mtl_power(const Matrix<T>& A, double x){	Matrix<T> C(A.m,A.n);	if(x==0) return Matrix<T>::Eye(A.m,A.n);	else{		if(Abs(x-(int)x)<real(mtl_numeric_limits<T>::epsilon())){			return mtl_power(A,(int)x);		}		for(int i=1;i<=A.m;i++){			for(int j=1;j<=A.n;j++) {				if(A.IsReal() && real(A[i][j])<0){					cerr << "ERROR: The A matrix has negative elements.\n";					cerr << "       Use a complex matrix.\n";					return Matrix<T>();				}				C[i][j]=pow(A[i][j],x);			}			}		return C;	}}template <typename T> Matrix<T> mtl_power(const Matrix<T>& A, int x){	Matrix<T> C(A.m,A.n);	for(int i=1;i<=A.m;i++)		for(int j=1;j<=A.n;j++) C[i][j]=Ipow(A[i][j],x);	return C;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -