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

📄 vector.h

📁 矩阵运算的模板类
💻 H
📖 第 1 页 / 共 3 页
字号:
		else vec[i]=T();
	}
}

//template <typename T> Vector<T>::Vector(const Vector<T>& A) : vec(A.vec),n(A.n),type(A.type) {//}

template <typename T> Vector<T>::~Vector() {}



/////////////////////////////
// operator overloading
///////////////////////////////template <typename T> Vector<T>& Vector<T>::operator=(const Vector<T>& A) {//	if(this == &A) return *this;
//	if(n != A.n) { vec.resize(A.n); n=A.n; }//	vec=A.vec; type=A.type; return *this;//}template <typename T> Vector<T>& Vector<T>::operator=(const T& a) {	for(int i=1; i<=n; ++i) vec[i] = a; return *this;}


#ifdef ALLOW_ACCESS_BY_BRACKET
#if defined(_DEBUG)
template <typename T> T& Vector<T>::operator[](int i) {
	if(i<=0 || i>n){
		cerr << "ERROR: index invalid " << i << endl;
		assert(0);
	}
	return vec[i];
}


template <typename T> const T& Vector<T>::operator[](int i) const {
	if(i<=0 || i>n){
		cerr << "ERROR: index invalid " << i << endl;
		assert(0);
	}
	return vec[i];
}


#else // !_DEBUG
template <typename T> inline T& Vector<T>::operator[](int i) {
	return vec[i];
}


template <typename T> inline const T& Vector<T>::operator[](int i) const {
	return vec[i];
}
#endif // _DEBUG
#endif // ALLOW_ACCESS_BY_BRACKET


#if defined(_DEBUG)template <typename T> const T& Vector<T>::operator()(int i) const {
	if(i<=0 || i>n){
		cerr << "ERROR: index invalid " << i << endl;
		assert(0);
	}
	return vec[i];
}


template <typename T> T& Vector<T>::operator()(int i) {
	if(i<=0 || i>n){
		cerr << "ERROR: index invalid " << i << endl;
		assert(0);
	}
	return vec[i];
}


#else // !_DEBUG
template <typename T> inline const T& Vector<T>::operator()(int i) const {
	return vec[i];
}


template <typename T> inline T& Vector<T>::operator()(int i) {
	return vec[i];
}

#endif // _DEBUG

template <typename T> inline Vector<T> Vector<T>::operator+() {	return (*this);}

template <typename T> Vector<T> Vector<T>::operator-() {	Vector<T> C=(*this); C*=(-1); return C;}

template <typename T> Vector<T>& Vector<T>::operator+=(const Vector<T>& B) {	assert(n==B.n);
	assert(type==B.type);	for(int i=1;i<=n;i++) vec[i]+=B.vec[i]; return (*this);}

template <typename T> Vector<T>& Vector<T>::operator-=(const Vector<T>& B) {	assert(n==B.n);
	assert(type==B.type);	for(int i=1;i<=n;i++) vec[i]-=B.vec[i]; return (*this);}

template <typename T> Vector<T>& Vector<T>::operator+=(const double b) {	for(int i=1;i<=n;i++) vec[i]+=b; return (*this);}

template <typename T> Vector<T>& Vector<T>::operator-=(const double b) {	for(int i=1;i<=n;i++) vec[i]-=b; return (*this);}

template <typename T> Vector<T>& Vector<T>::operator*=(const double b) {	for(int i=1;i<=n;i++) vec[i]*=b; return (*this);}

template <typename T> Vector<T>& Vector<T>::operator/=(const double b) {	for(int i=1;i<=n;i++) vec[i]/=b; return (*this);}


#ifndef DISABLE_COMPLEX
template <typename T> Vector<T>& Vector<T>::operator+=(const complex<T> b) {
	for(int i=1;i<=n;i++) vec[i]+=b; return (*this);
}


template <typename T> Vector<T>& Vector<T>::operator-=(const complex<T> b) {
	for(int i=1;i<=n;i++) vec[i]-=b; return (*this);
}


template <typename T> Vector<T>& Vector<T>::operator*=(const complex<T> b) {
	for(int i=1;i<=n;i++) vec[i]*=b; return (*this);
}


template <typename T> Vector<T>& Vector<T>::operator/=(const complex<T> b) {
	for(int i=1;i<=n;i++) vec[i]/=b; return (*this);
}
#endif


/////////////////////////////
// member functions
/////////////////////////////template <typename T> inline int Vector<T>::Size() const { 	return n;}


template <typename T> inline VectorType Vector<T>::Type() const { 
	return type;
}


template <typename T> inline int Vector<T>::SetType(VectorType type_) {
	type=type_;
	return 1;
}


template <typename T> Vector<T> Vector<T>::t() const {
	Vector<T> C(Size(),(Type()==ROW_VECTOR)?COL_VECTOR:ROW_VECTOR,T());
	for(int i=1;i<=Size();i++) C[i]=((*this)[i]);
	return C;
}


template <typename T> Vector<T> Vector<T>::ct() const {
	Vector<T> C(Size(),(Type()==ROW_VECTOR)?COL_VECTOR:ROW_VECTOR,T());
	for(int i=1;i<=Size();i++) C[i]=conj((*this)[i]);
	return C;
}

template <typename T> inline int Vector<T>::Resize(int new_n) { 	vec.resize(new_n+1);	n=new_n;
	return 1;}

template <typename T> int Vector<T>::Add(const T& a){ 	int n0=n; 	Resize(n0+1); 	vec[n0+1]=a; 	n=n0+1; 	return n; }

template <typename T> int Vector<T>::Erase(int c){ 	vec.erase(vec.begin()+c); 	n--;
	return 1;}


template <typename T> inline void Vector<T>::Clear(){ 
	vec.clear(); 
}


template <typename T> inline bool Vector<T>::Empty() const{ 
	return (Size()==0);
}

template <typename T> T Vector<T>::Sum_() const {	T sum=0; 	for(int i=1;i<=n;i++) sum+=vec[i]; 	return sum; }

template <typename T> T Min(const Vector<T>& A,int* idx=0){	return A.Min_(idx); }

template <typename T> T Vector<T>::Max_(int* idx) const {	T maxA=-mtl_numeric_limits<T>::max();	if(idx) *idx=0;	for(int i=1;i<=n;i++){		if(maxA<vec[i]){			maxA=vec[i];			if(idx) *idx=i;		}	}	return T(maxA);}

template <typename T> T Vector<T>::Min_(int* idx) const {	T minA=mtl_numeric_limits<T>::max();	if(idx) *idx=0;	for(int i=1;i<=n;i++){		if(minA>vec[i]){			minA=vec[i];			if(idx) *idx=i;		}	}	return T(minA);}


template <typename T> int Vector<T>::Print(ostream& s, const char *name) {
	if(name != 0 && name[0] != 0) s << name << " ";
	s << 1 << " " << n << endl;
	//s << (*this) << endl;
	mtl_ostream(s,(*this));
	return 1;
}

template <typename T> int Vector<T>::Print(ostream& s, string& name) {	return Print(s,name.c_str());}


template <typename T> int Vector<T>::Read(istream& s, const char *name) {
	string dummy;
	int itmp, nn;
	s >> dummy;
	if(name != 0 && name[0] != 0){
		assert(name==dummy);
	}
	s >> itmp >> nn;
	assert(itmp==1);
	Resize(nn);
	s >> (*this);
	return 1;
}


template <typename T> int Vector<T>::Read(istream& s, string& name) {
	return Read(s,name.c_str());
}

template <typename T> Vector<T> Vector<T>::SubVector(int n1, int n2){	assert(n2>=n1);	Vector<T> C(n2-n1+1); for(int i=1;i<=n2-n1+1;i++) C[i]=vec[i-1+n1];	return C;}


template <typename T> int Vector<T>::Save(const string& fname){
	FILE* fp=fopen(fname.c_str(),"wb");
	if(!fp) return 0;
	fprintf(fp,"FMAT 1 %d\n",n);
	for(int j=1;j<=n;j++){
		if((j-1)%10!=0) fprintf(fp," ");
		fprintf(fp,"%f",vec[j]);
		if(j%10==0) fprintf(fp,"\n");
	}
	if(n%10!=0) fprintf(fp,"\n");
	fclose(fp);
	return n;
}


template <typename T> int Vector<T>::SaveMatlab(const string& fname){
	FILE* fp=fopen(fname.c_str(),"wb");
	if(!fp) return 0;
	for(int j=1;j<=n;j++){
		fprintf(fp,"%f ",vec[j]);
	}
	fclose(fp);
	return n;
}


template <typename T> int Vector<T>::IsOne(double tolerance) const {
	for (int i=1; i<=n; i++) if(Abs(vec[i]-1)>tolerance) return 0;
	return 1;
}


template <typename T> int Vector<T>::IsZero(double tolerance) const {
	for (int i=1; i<=n; i++) if(Abs(vec[i])>tolerance) return 0;
	return 1;
}


template <typename T> int Vector<T>::IsUnit(double tolerance) const {
	double norm=Norm(*this);
	if(Abs(norm-1)>tolerance) return 0;
	return 1;
}



/////////////////////////////
// basic friend functions
/////////////////////////////
template <typename T> Vector<T> mtl_plus(const Vector<T>& A, const Vector<T>& B) {
	assert(A.n==B.n);
	assert(A.type==B.type);
	Vector<T> C=A; C+=B; return C;
}


template <typename T> Vector<T> mtl_minus(const Vector<T>& A, const Vector<T>& B) {
	assert(A.n==B.n);
	assert(A.type==B.type);
	Vector<T> C=A; C-=B; return C;
}


template <typename T> Vector<T> mtl_plus(const Vector<T>& A, const double b) {
	Vector<T> C=A; C+=b; return C;
}


template <typename T> Vector<T> mtl_minus(const Vector<T>& A, const double b) {
	Vector<T> C=A; C-=b; return C;
}


template <typename T> Vector<T> mtl_times(const Vector<T>& A, const double b) {
	Vector<T> C=A; C*=b; return C;
}


template <typename T> Vector<T> mtl_divide(const Vector<T>& A, const double b) {
	Vector<T> C=A; C/=b; return C;
}


template <typename T> Vector<T> mtl_plus(const double b, const Vector<T>& A) {
	Vector<T> C=A; C+=b; return C;
}


template <typename T> Vector<T> mtl_minus(const double b, const Vector<T>& A) {
	Vector<T> C=-A; C+=b; return C;
}


template <typename T> Vector<T> mtl_times(const double b, const Vector<T>& A) {
	Vector<T> C=A; C*=b; return C;
}


template <typename T> Vector<T> mtl_divide(const double b, const Vector<T>& A) {
	Vector<T> C(A.n); for(int i=1;i<=A.n;i++) C.vec[i]=b/A.vec[i]; return C;
}


#ifndef DISABLE_COMPLEX
template <typename T> Vector<T> mtl_plus(const Vector<T>& A, const complex<T> b) {
	Vector<T> C=A; C+=b; return C;
}


template <typename T> Vector<T> mtl_minus(const Vector<T>& A, const complex<T> b) {
	Vector<T> C=A; C-=b; return C;
}


template <typename T> Vector<T> mtl_times(const Vector<T>& A, const complex<T> b) {
	Vector<T> C=A; C*=b; return C;
}


template <typename T> Vector<T> mtl_divide(const Vector<T>& A, const complex<T> b) {
	Vector<T> C=A; C/=b; return C;
}


template <typename T> Vector<T> mtl_plus(const complex<T> b, const Vector<T>& A) {
	Vector<T> C=A; C+=b; return C;
}


template <typename T> Vector<T> mtl_minus(const complex<T> b, const Vector<T>& A) {
	Vector<T> C=-A; C+=b; return C;
}


template <typename T> Vector<T> mtl_times(const complex<T> b, const Vector<T>& A) {
	Vector<T> C=A; C*=b; return C;
}


template <typename T> Vector<T> mtl_divide(const complex<T> b, const Vector<T>& A) {
	Vector<T> C(A.n); for(int i=1;i<=A.n;i++) C.vec[i]=b/A.vec[i]; return C;
}
#endif


template <typename T> Vector<T> mtl_times(const Vector<T>& A, const Vector<T>& B){
	assert(A.Size()==B.Size());
	assert(A.type==B.type);

⌨️ 快捷键说明

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