两个矩阵相乘的源程序

两个矩阵相乘的源程序

方案一:

/*****************A=B*C******************/

#include

#include

#define X 3

#define Y 3

int a[X][Y];

int b[X][Y];

int c[X][Y];

void matrix(int b[][X],int c[][Y]);

main()

{

int i,j,temp;

clrscr();

printf(

for(i=0;i

for(j=0;j

scanf(

b[j]=temp;

}

printf(

for(i=0;i

for(j=0;j

scanf(

c[j]=temp;

}

matrix(b,c);

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

printf(

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

printf(

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

getch();

return 0;

}

/********************************************************************/ void matrix(int b[][X],int c[][Y])

{

int i,j,k,temp;

for(i=0;i

for(j=0;j

for(k=0;k

a[j]+=b[k]*c[k][j];

}

}

方案二:

/*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

for(int j=0;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

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

{

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

{

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

for (int j=0;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

for (int j=0;jGetDimY();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;iGetDimX();i++)

for (int j=0;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

for (int j=0;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

for (int j=0;j

{

GetData(i,j,&t);

temp->SetData(j,i,t);

}

return temp;

}

Matrix * GetEMatrix(int n) //得到nXn的单位矩阵

{

if(n

Matrix *temp=new Matrix(n,n);

for (int i=0;i

for (int j=0;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

temp=temp->LeftXMatrix(this);

return temp;

}

};

两个矩阵相乘的源程序

方案一:

/*****************A=B*C******************/

#include

#include

#define X 3

#define Y 3

int a[X][Y];

int b[X][Y];

int c[X][Y];

void matrix(int b[][X],int c[][Y]);

main()

{

int i,j,temp;

clrscr();

printf(

for(i=0;i

for(j=0;j

scanf(

b[j]=temp;

}

printf(

for(i=0;i

for(j=0;j

scanf(

c[j]=temp;

}

matrix(b,c);

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

printf(

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

printf(

printf(

for(i=0;i

printf(

for(j=0;j

printf(

}

getch();

return 0;

}

/********************************************************************/ void matrix(int b[][X],int c[][Y])

{

int i,j,k,temp;

for(i=0;i

for(j=0;j

for(k=0;k

a[j]+=b[k]*c[k][j];

}

}

方案二:

/*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

for(int j=0;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

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

{

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

{

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

for (int j=0;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

for (int j=0;jGetDimY();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;iGetDimX();i++)

for (int j=0;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

for (int j=0;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

for (int j=0;j

{

GetData(i,j,&t);

temp->SetData(j,i,t);

}

return temp;

}

Matrix * GetEMatrix(int n) //得到nXn的单位矩阵

{

if(n

Matrix *temp=new Matrix(n,n);

for (int i=0;i

for (int j=0;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

temp=temp->LeftXMatrix(this);

return temp;

}

};


相关内容

  • 数字信号分析实验报告1
  • ******************************** <信号分析与处理> 实 验 报 告 实验名称:信号产生 班 级:电气研-14 学 号:[1**********]14 姓 名:刘家利 联系方式:[1**********] 一. 实验内容: 1. 产生至少三种典型连续信号, ...

  • 运算符重载实验报告
  • Guangxi University of Science and Technology 实验报告 实验课程: C++程序设计教程 实验内容: 运算符重载 院 (系): 专 业: 软件工程方向 班 级: 学生姓名: 学 号: 指导教师: 2013年 11 月 18日 一.实验目的: (1) 掌握运算 ...

  • 东北大学编程实验报告
  • 东北大学软件学院 c 语言编程实验报告 <高等代数> 专 业: 班 级: 学 号: 姓 名: 完成时间:2014/5/15 指导教师:郭阳 评定成绩: 第一章:多项式 题目: 1.求当x =3时,多项式x 3-6x 2+15x -14的值: 2.求多项式x 3-6x 2+15x -14和 ...

  • 信道编码实验报告
  • 无线通信基础课程设计报告 (信道编码) 小组成员: 指导老师: 完成时间: 无线通信系统课程设计报告 实验摘要:数字信号在传输中往往由于各种原因,使得在传送的数据流中产生误码,从 而使接收端产生图象跳跃.不连续等现象.信道编码通过对数码流进行相应的处理,使系统具有一定的检错和纠错能力,可极大地避免码 ...

  • 第七节 控制三维空间:坐标变换
  • 第七节 你将学到: 控制三维空间:坐标变换 中有条理的显示出来,你必须根据它们的关系来安排.在这一节中你将学到在场景中移动形状和物体.实际上你并没有移动它们,只是改变了坐标系统.对任何一个三维程序员来说在三维场景中正确摆放物体是很重要的工具.正如你将看到的一样,这将会对你描述物体和平移旋转物体都是很 ...

  • 分块矩阵乘法的程序性能
  • 实验四 分块矩阵乘法的程序性能 一.实验目的 本次实验比较分块矩阵乘法与普通矩阵乘法的性能,并考察分块大小对分块矩阵乘法性能的影响. 二.实验原理 1. 矩阵相乘 为简单起见,本次实验矩阵相乘中的矩阵都是方阵,行数和列数都为 n . 2. 程序性能 本次实验中考察的程序性能指的是程序的CPU 执行时 ...

  • 常见有关矩阵的代码
  • 参考资料: 行列式:http://zh.wikipedia.org/wiki/行列式 #.E4.BB.A3.E6.95.B0.E4.BD.99.E5.AD.90.E5.BC.8F 伴随矩阵:http://zh.wikipedia.org/wiki/伴随矩阵 余因子矩阵:http://zh.wikip ...

  • 4.1稀疏矩阵运算器
  • 稀疏矩阵运算器 一.实验目的 使读者能深入研究数组的存储表示和实现技术 二.实验内容 [问题描述]稀疏矩阵是指那些多数元素为零的矩阵,利用"稀疏"特点进行存储和计算可以大大节省存储空间,提高计算效率.实现一个能进行稀疏矩阵基本运算的运算器. [基本要求]以"带行逻辑链接 ...

  • [博客大赛]基于Matlab的数字图像处理
  • 概述 我们知道,图像在Matlab 中是用矩阵表示的,虽然RGB等彩色图像和灰度图像的矩阵表示方式不同,终归也是矩阵. 而在Matlab中所涉及的线性空间滤波,从本质上来说是两个矩阵的卷积或者相关运算:通过相应滤波器(或者称之为掩膜,实际也为一个二维矩阵)与图像矩阵进行卷积或者相关运算实现.卷积运算 ...