一、实验目的和要求
实验目的:理解数组特性和二维数组的存储方式,掌握使用二维数组实现矩阵运算的方法,了解各种特殊矩阵的压缩存储方法。
实验要求:熟练运用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
![](https://img-blog.csdnimg.cn/img_convert/2006a7d8f93930b35c71a32aee02994c.png)
![](https://img-blog.csdnimg.cn/img_convert/816d81a409bf909cf73c72b14a41cb47.png)
![](https://img-blog.csdnimg.cn/img_convert/e56f392c4b09c90f317b7d17f886e448.png)