数据结构——矩阵运算;特殊矩阵压缩存储

一、实验目的和要求

实验目的:理解数组特性和二维数组的存储方式,掌握使用二维数组实现矩阵运算的方法,了解各种特殊矩阵的压缩存储方法。

实验要求:熟练运用Java语言实现数据结构设计和算法设计,了解程序运行过程中出现的各种错误

具体要求如下:

算法有明确的思路,模块结构合理,表述清楚,算法完整,考虑各种可能情况

采用Java语言和面向对象设计思想实现

程序必须运行通过,对于各种输入数据,有明确的不同的输出结果。程序运行有错误时,必须采取各种调试手段排除错误

二、实验题目

5-1矩阵类Matrix增加以下成员方法

Matrix add(Matrix b):返回当前矩阵与矩阵b相加后的结果矩阵;

Matrix multiply(Matrix b):返回当前矩阵与矩阵b相乘后的结果矩阵。

三、实验方法与步骤

声明矩阵行数,列数,构造方法等。

矩阵加减要求两个矩阵类型一致,即行列数相同。

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵 。

四、实验原始纪录

import java.util.*;

public classMatrix {

private static final int ROW=100;

private static final int COL=100;

private int r;

private int c;

private double matrix[][];

public Matrix()//构造函数,初始化

{

matrix=new double[ROW][COL];//默认行列分配100空间;

this.r=ROW;

this.c=COL;

for(int i=0;i<ROW;i++)

for(int j=0;j<COL;j++)

matrix[i][j]=0;

}

public Matrix(int row,int col)//初始化

{

matrix=new double[row][col];

this.r=row;

this.c=col;

for(int i=0;i<row;i++)

for(int j=0;j<col;j++)

matrix[i][j]=0;

}

boolean set(int row, int col, double value)

{

if(row<0||row>this.r||col<0||col>this.r)//判断位置是否合法;

return false;

else

{

matrix[row][col]=value;

return true;

}

}

double get(int row,int col)

{

return matrix[row][col];

}

int width()

{

return this.c;

}

int height()

{

return this.r;

}

Matrix add(Matrix b)//返回相加后的数组

{

if(this.r!=b.r||this.c!=b.c)

{

System.out.println("ERROR!");

return null;

}

Matrix m=new Matrix(r,c);

for(int i=0;i<r;i++)

for(int j=0;j<c;j++)

m.matrix[i][j]=this.matrix[i][j]+b.matrix[i][j];

return m;

}

Matrix multiply(Matrix b)

{

if(this.r!=b.c)//如果两个矩阵不服和相乘条件,输出错误;

{

System.out.println("ERORR!");

return null;

}

int r=this.r;

int c=b.c;

Matrix m=new Matrix(r,c);

for(int i=0;i<r;i++)//矩阵的乘法;

for(int j=0;j<c;j++)

{

double s=0;

for(int i1=0;i1<r;i1++)

for(int j1=0;j1<c;j1++)

s=s+this.matrix[i1][j1]*b.matrix[j1][i1];

m.matrix[i][j]=s;

}

return m;

}

void print()

{

for(int i=0;i<this.r;i++)

{

for(int j=0;j<this.c;j++)

System.out.print(matrix[i][j]+" ");

System.out.println();

}

}

public static void main(String[] args) {

// TODO Auto-generated methodstub

Scanner sc=new Scanner(System.in);

System.out.print("请输入第一个矩阵的行和列:");//输入第一个矩阵

int r=sc.nextInt();

int c=sc.nextInt();

Matrix ma=new Matrix(r,c);

double num;

for(int i=0;i<r;i++)

for(int j=0;j<c;j++)

{

System.out.print("请输入第"+(i+1)+"行,第"+(j+1)+"列的元素值:");

num=sc.nextDouble();

ma.set(i,j,num);

}

System.out.println("第一个矩阵是"+ma.height()+"行,"+ma.width()+"列的矩阵:");

ma.print();

System.out.print("请输入第二个矩阵的行和列:");//输入第二个矩阵;

r=sc.nextInt();

c=sc.nextInt();

Matrix mb=new Matrix(r,c);

for(int i=0;i<r;i++)

for(int j=0;j<c;j++)

{

System.out.print("请输入第"+(i+1)+"行,第"+(j+1)+"列的元素值:");

num=sc.nextDouble();

mb.set(i,j,num);

}

System.out.println("第二个矩阵是"+mb.height()+"行,"+mb.width()+"列的矩阵:");

mb.print();

Matrix mc=ma.add(mb);

System.out.println("两个矩阵相加是:");

mc.print();

mc=ma.multiply(mb);

System.out.println("两个矩阵相乘是:");

mc.print();

}

}

五、实验结果及分析

请输入第一个矩阵的行和列:2 2

请输入第1行,第1列的元素值:3

请输入第1行,第2列的元素值:1

请输入第2行,第1列的元素值:5

请输入第2行,第2列的元素值:6

第一个矩阵是2行,2列的矩阵:

1.02.0

3.04.0

请输入第二个矩阵的行和列:2 2

请输入第1行,第1列的元素值:1

请输入第1行,第2列的元素值:0

请输入第2行,第1列的元素值:1

请输入第2行,第2列的元素值:2

第二个矩阵是2行,2列的矩阵:2

1.0 0.0

1.0 2.0

两个矩阵相加是:

4.0 1.0

6.0 8.0

两个矩阵相乘是:

16.0 16.0

16.0 16.0

猜你喜欢

转载自blog.csdn.net/weixin_45823684/article/details/128536774