matclass.cpp

来自「普通平差程序」· C++ 代码 · 共 157 行

CPP
157
字号
#include <stdlib.h>
#include <math.h>

class MAT
{        
	
    public:
        MAT();	
		MAT(int hang,int lie);
 MAT convert();
		~MAT();
		int row;
		int rank; 

		double *elem;	
       	void print();//print out the Max
		void input();
        void input1();
	private:
		char name[20]; 
};
void MAT::input()
{
	for(int i=0;i<row*rank;i++)
		cin>>elem[i];

}
void MAT::input1()
{
	if(row!=rank) for(int i=0;i<row*rank;i++)
		this->elem[i]=1;
     else for( int i=0;i<row;i++)
		 for(int j=0;j<rank;j++)
		 {  if(i==j)
			 this->elem[i+j+i*(rank-1)]=1;
		    else  this->elem[i+j+i*(rank-1)]=0;
		 }
}
MAT::MAT()
{
	
}

void MAT::print()
{
		for(int i=0;i<row;i++)
	{
		for(int j=0;j<rank;j++)
		cout<<" "<<*(elem+i+j+i*(rank-1));
		cout<<endl;}
}


MAT::MAT(int hang,int lie)
{//1.input the number of row and rank
	row=hang;
   	rank=lie;
//2.input the elements of the Mat
	elem=new double[hang*lie];

	for(int i=0;i<row*rank;i++)
		elem[i]=0;
//			
		
}
MAT::~MAT()
{
	;
}

MAT MAT::convert()
{
	MAT B;
	B.row=rank;
	B.rank=row;
	B.elem=new double[B.row*B.rank];
	  for(int i=0;i<B.rank;i++)
     for(int j=0;j<B.row;j++)
		{
		 int k=i+j+j*(B.rank-1);
		 B.elem[k]=*(elem+i+j+i*(B.row-1));
	 
	 }
 return B; 
}
int tim(MAT A,MAT B,MAT C)
{   int i;  	
	if(A.rank!=B.row) return 0;
    
		 for(i=0;i<(C.row*C.rank);i++) C.elem[i]=0;
		for(i=0;i<C.row;i++)
		for(int j=0;j<C.rank;j++)
				for(int k=0;k<B.row;k++)
					C.elem[i+j+i*(C.rank-1)]+=A.elem[i+k+i*(A.rank-1)]*B.elem[k+j+k*(B.rank-1)];
		return 1;

}
//*********矩阵求逆函数定义:***************
	//函数说明:
	//1 MAX定义矩阵最大维数;
	//2 形参C[][]为输入矩阵,B[][]为输出矩阵
	//3 矩阵可逆,返回值为1/否则,返回值为-1;
int inverse(MAT C,MAT B)
{
	MAT A(C.row,C.row);
double b,js(0);
int m, i,j,k;
if(C.row!=C.rank) return 0;
m=C.row;
for(i=0;i<m;i++)
 for(j=0;j<m;j++)
 {
	 	A.elem[i+j+i*(A.rank-1)]=C.elem[i+j+i*(C.rank-1)]; 
     if(i==j)	B.elem[i+j+i*(B.rank-1)]=1;
	 else 	B.elem[i+j+i*(B.rank-1)]=0;
 }
	for(i=0;i<m;i++)
      for(j=0;j<m;j++)
      { 
		  if(A.elem[i+i+i*(A.rank-1)]==0)
		    for(int l=i+1;l<m;l++)
			{if(A.elem[l+i+l*(A.rank-1)]!=0)
							{
								for(int k1=0;k1<m;k1++)
                                {A.elem[i+k1+i*(A.rank-1)]+=A.elem[l+k1+k1*(A.rank-1)];B.elem[i+k1+i*(B.rank-1)]+=B.elem[l+k1+l*(B.rank-1)];}
								goto BB;
			}}
			  	  
								  
BB:	  b=A.elem[j+i+j*(A.rank-1)]/A.elem[i+i+i*(A.rank-1)];
	    for(k=0;k<m;k++) 
			if(i!=j) { A.elem[j+k+j*(A.rank-1)]-=b*A.elem[i+k+i*(A.rank-1)];B.elem[j+k+j*(B.rank-1)]-=b*B.elem[i+k+i*(B.rank-1)];}
	  }
	  for(i=0;i<m;i++)
	  {
		  b=A.elem[i+i+i*(A.rank-1)]; if(fabs(b)<0.000000001) goto ss;
      for(j=0;j<m;j++)
	  {
            A.elem[i+j+i*(A.rank-1)]/=b; B.elem[i+j+i*(B.rank-1)]/=b;	  
	  }
	  } return 1; 
	  goto tt;
	  
ss:return 0; 
tt:;
}

int sub(MAT A,MAT B,MAT AC)
{

	int i;
	if(A.row!=B.row || A.rank!=B.rank) { cout<<" can't do sub "<<endl;return 0;}
	for( i=0;i<A.row*A.rank;i++)
		AC.elem[i]=A.elem[i]+B.elem[i];

 return 1;
}

⌨️ 快捷键说明

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