幼儿园体育器械有哪些:两个矩阵相乘的通用程序

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/07 16:51:58
各位哥哥,姐姐,帮帮我把,谢谢了

给一个自己写的矩阵类
/*Matrix control head file*/

#ifndef NULL
#define NULL 0;
#endif
#define TYPE long

class Matrix
{
private:
TYPE *data;
int MATRIX_H_SIZE;
int MATRIX_V_SIZE;
bool IS_EMPTY;

public:
Matrix(){IS_EMPTY=true;}

Matrix(int h_dim_size,int v_dim_size){
data=new TYPE[h_dim_size*v_dim_size];
MATRIX_H_SIZE=h_dim_size;
MATRIX_V_SIZE=v_dim_size;
IS_EMPTY=false;
}

Matrix(Matrix *matrix){
if (!matrix->IsEmpty()){
data=new TYPE[matrix->GetDimX()*matrix->GetDimY()];
MATRIX_H_SIZE=matrix->GetDimX();
MATRIX_V_SIZE=matrix->GetDimY();
IS_EMPTY=false;
TYPE t;
for(int i=0;i<MATRIX_H_SIZE;i++)
for(int j=0;j<MATRIX_V_SIZE;j++)
{
matrix->GetData(i,j,&t);
SetData(i,j,t);
}
}
else
IS_EMPTY=true;
}

~Matrix(){delete[] data;}

bool MatrixReload(int h_dim_size,int v_dim_size){
if (!IS_EMPTY) return false;
data=new TYPE[h_dim_size*v_dim_size];
MATRIX_H_SIZE=h_dim_size;
MATRIX_V_SIZE=v_dim_size;
IS_EMPTY=false;
return true;
}

bool IsEmpty(){
return IS_EMPTY;
}

int GetDimX(){return MATRIX_H_SIZE;}

int GetDimY(){return MATRIX_V_SIZE;}

bool MatrixClear(){
if (IS_EMPTY) return false;
delete [] data;
IS_EMPTY=true;
return true;
}

bool SetData(int h_index,int v_index,TYPE data)
{
if (IS_EMPTY) return false;
this->data[h_index*MATRIX_V_SIZE+v_index]=data;
return true;
}

bool GetData(int h_index,int v_index,TYPE *return_data)
{ if (IS_EMPTY) return false;
if (h_index>=MATRIX_H_SIZE || v_index>=MATRIX_V_SIZE) return false;
*return_data=data[h_index*MATRIX_V_SIZE+v_index];
return true;
}

//矩阵操作
TYPE SumHXV(int m,int n,Matrix *matrix) //m行x n列
{
TYPE sum(0);
TYPE temp[2];
for(int i=0;i<MATRIX_V_SIZE;i++){
GetData(m,i,&temp[0]);
matrix->GetData(i,n,&temp[1]);
sum+=temp[0]*temp[1];

}
return sum;
}

Matrix * HSwap(int m,int n)//行交换
{
if (IS_EMPTY) return NULL;
Matrix *temp=new Matrix(this);
TYPE t[2];
for(int i=0;i<MATRIX_V_SIZE;i++)
{
temp->GetData(m-1,i,&t[0]);
temp->GetData(n-1,i,&t[1]);
temp->SetData(m-1,i,t[1]);
temp->SetData(n-1,i,t[0]);
}
return temp;
}

Matrix * VSwap(int m,int n)//行交换
{
if (IS_EMPTY) return NULL;
Matrix *temp=new Matrix(this);
TYPE t[2];
for(int i=0;i<MATRIX_H_SIZE;i++)
{
temp->GetData(i,m-1,&t[0]);
temp->GetData(i,n-1,&t[1]);
temp->SetData(i,m-1,t[1]);
temp->SetData(i,n-1,t[0]);
}
return temp;
}

Matrix * AddMatrix(Matrix *matrix)
{
if (IS_EMPTY) return NULL;
if (matrix->IsEmpty()) return this;
if (MATRIX_H_SIZE!=matrix->GetDimX() ||
MATRIX_V_SIZE!=matrix->GetDimY())
return this;

Matrix *temp=new Matrix(MATRIX_H_SIZE,MATRIX_V_SIZE);
TYPE t[3];
for (int i=0;i<MATRIX_H_SIZE;i++)
for (int j=0;j<MATRIX_V_SIZE;j++)
{ GetData(i,j,&t[0]);
matrix->GetData(i,j,&t[1]);
t[2]=t[0]+t[1];
temp->SetData(i,j,t[2]);
}
return temp;
}

Matrix * RightXMatrix(Matrix *matrix) //矩阵右乘
{
if (IS_EMPTY) return NULL;
if (matrix->IsEmpty()) return this;
if (MATRIX_V_SIZE!=matrix->GetDimX())
return this;

Matrix *temp=new Matrix(MATRIX_H_SIZE,matrix->GetDimY());
for (int i=0;i<MATRIX_H_SIZE;i++)
for (int j=0;j<matrix->GetDimY();j++)
temp->SetData(i,j,SumHXV(i,j,matrix));

return temp;
}

Matrix * LeftXMatrix(Matrix *matrix) //矩阵左乘
{
if (IS_EMPTY) return NULL;
if (matrix->IsEmpty()) return this;
if (MATRIX_H_SIZE!=matrix->GetDimY())
return this;

Matrix *temp=new Matrix(matrix->GetDimX(),MATRIX_V_SIZE);
for (int i=0;i<matrix->GetDimX();i++)
for (int j=0;j<MATRIX_V_SIZE;j++)
temp->SetData(i,j,matrix->SumHXV(i,j,this));

return temp;
}

Matrix * NumXMatrix(TYPE num){
if (IS_EMPTY) return NULL;
Matrix *temp=new Matrix(MATRIX_H_SIZE,MATRIX_V_SIZE);
TYPE t;
for (int i=0;i<MATRIX_H_SIZE;i++)
for (int j=0;j<MATRIX_V_SIZE;j++)
{
GetData(i,j,&t);
temp->SetData(i,j,t*num);
}
return temp;
}

Matrix * ReverseMatrix() //矩阵转置
{
if (IS_EMPTY) return this;
Matrix *temp=new Matrix(MATRIX_V_SIZE,MATRIX_H_SIZE);
TYPE t;
for (int i=0;i<MATRIX_H_SIZE;i++)
for (int j=0;j<MATRIX_V_SIZE;j++)
{
GetData(i,j,&t);
temp->SetData(j,i,t);
}
return temp;
}

Matrix * GetEMatrix(int n) //得到nXn的单位矩阵
{
if(n<2) return NULL;
Matrix *temp=new Matrix(n,n);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
(i==j)?temp->SetData(i,j,1):temp->SetData(i,j,0);
return temp;
}

Matrix * MatrixPow(int times) //矩阵幂运算
{
if (IS_EMPTY)return NULL;
Matrix *temp=new Matrix(this);
for(int i=1;i<times;i++)
temp=temp->LeftXMatrix(this);
return temp;
}
};