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

📄 array.h

📁 按列选主高斯消元,高斯消元算法
💻 H
字号:
//array.h
//二维数组一维动态化+矩阵
//x[m][n] to x[long],return m*h+n
#define NULL 0

template <class T>

class Array
{
public :
	Array()
	{
		IsEmpty=1;
	}
	Array(int m,int n);  //二维数组定义(构造函数)

	//基本操作
	void Initalize(int m,int n);    //array()后使用,二维数组构造 Initalize(2,2)=构造一个2x2的二维数组    
	void InsertDataEX(int m,int n,T data);   //二维化赋值 如InsertDataEX(0,2,10)=array[0][2]=10
	void InsertDataNormal(int m,T data);     //一维化赋值 如InsertDataNormal(2,10)=array[2]=10
	T& GetDataEX(int m,int n);     //得到数据(二维方式)
	T& GetDataNormal(int m);     //得到数据(一维方式)
	int IsArrayEmpty()
	{
		return IsEmpty;
	}

    //矩阵运算
	//得到二维数组指定列中行范围的最大值
	//vpos指定列,hstartpos指定行开始,hstartpos指定行结束
	//&pos返回为最大值的行数
	//列主消元时取主用
    T GetMaxVertical(int vpos,int hstartpos,int hendpos,int &pos); 
	void HSwap(int m,int n);//行交换
	void HAdd(int m,int n,double dataflag);//行相加 n行加m行*dataflag放入n行
    void GaussMethod(int HValue,int VValue);      //高斯消元函数
	//计算高斯消元后的x值,result为列为1的矩阵
	//放x值用,可以使用Array<int(double...)> 数组名(行数(x的数量),1);来定义
    void GetGaussResult(Array<T> result,int HValue,int VValue);

private:
	T *array;
	long h;
	int IsEmpty;
};

template <class T>
Array <T>::Array(int m,int n)
{
	if (m>=0 && n>=0)
	{
		array=new T[m*n];
		h=n;
		IsEmpty=1;
	}
}


template <class T>
T& Array <T>::GetDataEX(int m,int n)
{
       return array[m*h+n];
}

template <class T>
T& Array <T>::GetDataNormal(int m)
{
      return array[m];
}

template <class T>
void Array <T>::InsertDataEX(int m,int n,T data)
{
	if (m>=0 && n>=0 && array!=NULL)
	{
		array[h*m+n]=data;
        IsEmpty=0;
	}
}

template <class T>
void Array <T>::InsertDataNormal(int m,T data)
{
	if (m>=0 && array!=NULL)
	{
		array[m]=data;
	    IsEmpty=0;
	}
}

template <class T>
void Array<T>::Initalize(int m,int n)
{
	if (m>=0 && n>=0)
	{
		array=new T[m*n];
		h=n;
		IsEmpty=1;
	}
}
template <class T>
T Array<T>::GetMaxVertical(int vpos,int hstartpos,int hendpos,int &pos)  //得到二维数组列中指定地方的最大值,hpos指定列,vstartpos指定行开始,,vstartpos指定行结束,i返回为最大值的行数
{
 int n;//行数
 T temp;
 temp=GetDataEX(hstartpos,vpos);
 pos=hstartpos;
     for (n=hstartpos;n<=hendpos;n++)
	 {
          if(GetDataEX(n,vpos)>=temp) 
		  {
			  temp=GetDataEX(n,vpos);
              pos=n;
		  }
	 }
	 return temp;
}

template <class T>
void Array<T>::HSwap(int m,int n)//行交换
{
	int i;
    T temp;
	for(i=0;i<=h-1;i++)
	{
		temp=GetDataEX(m,i);
		GetDataEX(m,i)=GetDataEX(n,i);
        GetDataEX(n,i)=temp;
	}
}
template <class T>
void Array<T>::HAdd(int m,int n,double dataflag)//行相加 n行加m行*dataflag放入n行
{
	int i;
	for(i=0;i<=h-1;i++)
        GetDataEX(n,i)=GetDataEX(m,i)*dataflag+GetDataEX(n,i);
}

template <class T>
void Array<T>::GaussMethod(int HValue,int VValue)   //高斯消元函数
{
	//vvalue 列数,hvalue行数 0.....n-1
	int i,j,pos;
	T temp,mainelement;
	for (i=0;i<=VValue;i++)
	{
		//选取主元
		mainelement=GetMaxVertical(i,i,HValue,pos);
        //行交换
        HSwap(i,pos);
        //减法运算
		for (j=i+1;j<=HValue;j++)
		{
			temp=(-1.0)*GetDataEX(j,i)/mainelement;
		    HAdd(i,j,temp);//行相加 j行加i行*比例系数放入j行
		}
	}
}

template <class T>
void Array<T>::GetGaussResult(Array<T> result,int HValue,int VValue)
{	 
	 //vvalue 列数,hvalue行数 0.....n-1
	 int i,j;
	 T temp;
	 temp=GetDataEX(HValue,VValue)/GetDataEX(HValue,VValue-1);
	 result.InsertDataNormal(HValue,temp);
     for(i=HValue-1;i>=0;i--)
	 {
	   temp=0;
	   for (j=i+1;j<=VValue-1;j++)
           temp=temp+GetDataEX(i,j)*result.GetDataNormal(j);
	   temp=(GetDataEX(i,VValue)-temp)/GetDataEX(i,i);
       if (i>=0) result.InsertDataNormal(i,temp);
	 }
}

⌨️ 快捷键说明

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