版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.实验报告五 特殊矩阵和广义表的存储和运算班级: 姓名: 学号: 专业: 一、 实验目的:1、 了解多维数组的存储方式和存取特点2、 熟悉稀疏矩阵的存储方式3、 用三元组法实现稀疏矩阵的相、减、转置算法。二、 实验内容:1、 在矩阵类Matrix中,增加下列操作:1) 判断一个矩阵是否为上(下)三角矩阵、对称矩阵。2) 判断两个矩阵是否相等。3) 计算两个矩阵的乘积。算法原代码:public class Matrix private int matrix; private int row; private int column; public Matrix(int matrix) row =
2、matrix.length; column = matrix0.length; this.matrix = new introwcolumn; for(int i=0;imatrix.length;i+) for(int j=0;jmatrixi.length;j+) this.matrixij = matrixij; public Matrix(int row, int column) this.row = row; this.column = column; matrix = new introwcolumn; /* * 判断上三角 * param matrix * return */ p
3、ublic static boolean isUpTri(Matrix matrix) if(matrix.column!=matrix.row) throw new IllegalArgumentException(矩阵的行列不相等); for(int i=0;imatrix.getRow();i+) for(int j=i+1;jmatrix.getColumn();j+) if(0 = matrix.getElement(i, j) return false; return true; /* * 判断下三角 * param matrix * return */ public static
4、 boolean isDownTri(Matrix matrix) /先判断行列相不相等 if(matrix.column!=matrix.row) throw new IllegalArgumentException(矩阵的行列不相等); for(int j=0;jmatrix.getColumn();j+) for(int i=j+1;imatrix.getColumn();i+) if(matrix.getElement(i,j)=0) return false; return true; /* * 判断matrix是不是对称矩阵 * param matrix * return */ p
5、ublic static boolean isSymmetry(Matrix matrix) for(int i=0;imatrix.getRow();i+) for(int j=i+1;jmatrix.getColumn();j+) if(matrix.getElement(i,j) != matrix.getElement(j,i) return false; return true; /* * 判断两个矩阵是否相等 * param matrix1 * param matrix2 * return */ public static boolean equals(Matrix matrix1
6、, Matrix matrix2) if(matrix1.getRow()!=matrix2.getRow()|matrix1.getColumn()!=matrix2.getColumn() return false; for(int i=0;imatrix1.row;i+) for(int j=0;jmatrix1.column;j+) if(matrix1.getElement(i,j)!=matrix2.getElement(i,j) return false; return true; /* * 将两个矩阵相乘 * param TemPMatrix * return */ publi
7、c Matrix multiply(Matrix TemPMatrix) if(column!=TemPMatrix.row) throw new IllegalArgumentException(行列不匹配,两个矩阵无法相乘); Matrix matrix1 = new Matrix(row,TemPMatrix.column); for(int i=0;imatrix1.row;i+) for(int j=0;jmatrix1.column;j+) int sum = 0; for(int k=0;kcolumn;k+) sum += (this.matrixik)*(TemPMatrix
8、.getElement(k,j); matrix1.setElement(i,j,sum); return matrix1; /* * 两个矩阵相加 * param matrix * return */ public Matrix plus(Matrix matrix) if(row!=matrix.getRow()&column!=matrix.getColumn() throw new IllegalArgumentException(行列不匹配); int tempMatrix = new introwcolumn; for(int i=0;irow;i+) for(int j=0;jc
9、olumn;j+) tempMatrixij = this.matrixij+ matrix.getElement(i,j); return new Matrix(tempMatrix); Override public boolean equals(Object o) if (this = o) return true; if (o = null | getClass() != o.getClass() return false; Matrix matrix1 = (Matrix) o; if (row != matrix1.row) return false; if (column !=
10、matrix1.column) return false; return Arrays.deepEquals(matrix, matrix1.matrix); public void setElement(int row, int column, int element) matrixrowcolumn = element; public int getElement(int row, int column) return matrixrowcolumn; public int getRow() return row; public int getColumn() return column;
11、 Override public String toString() String string = new String(); for(int i=0;irow;i+) for(int j=0;jcolumn;j+) string += matrixij+ ; string += n; return string; public class Test public static void main(String args) throws Exception Matrix matrix1 = new Matrix(new int1,0,0,0,0,1,2,0,0,0,1,2,3,0,0,1,2
12、,3,4,0,1,2,3,4,5); Matrix matrix2 = new Matrix(new int1,2,3,4,5,0,2,3,4,5,0,0,3,4,5,0,0,0,4,5,0,0,0,0,5); Matrix matrix3 = new Matrix(new int1,2,3,4,5,2,1,6,7,8,3,6,1,9,10,4,7,9,1,11,5,8,10,11,1); Matrix matrix4 = new Matrix(new int1,0,0,0,0,1,2,0,0,0,1,2,3,0,0,1,2,3,4,0,1,2,3,4,5); System.out.print
13、ln(matrix1); System.out.println(matrix2); System.out.println(matrix1是否是上三角:+Matrix.isUpTri(matrix1); System.out.println(matrix2是否是上三角:+Matrix.isUpTri(matrix2); System.out.println(matrix1是否是下三角:+Matrix.isDownTri(matrix1); System.out.println(matrix2是否是下三角:+Matrix.isDownTri(matrix2); System.out.println
14、(matrix3是否是对称矩阵+Matrix.isSymmetry(matrix3); System.out.println(matrix2是否是对称矩阵+Matrix.isSymmetry(matrix2); System.out.println(matrix1是否等于matrix2:+matrix1.equals(matrix2); System.out.println(matrix1是否等于matrix4:+matrix1.equals(matrix4); System.out.println(); System.out.println(matrix1*matrix2); System.
15、out.println(matrix1.multiply(matrix2); 测试结果如下:2、在三元组行的单链表表示的稀疏矩阵类LinkedMatrix中,增加判断矩阵相等、判断对称矩阵、计算矩阵乘积等操作。算法源代码:public interface IPlus public void plus(E object);/* * 用于表示稀疏矩阵中的元素 * Created by 74062 on 2017/4/16. */public class Element implements Comparable,IPlus private int column; private int value
16、; public Element(int column, int value) this.column = column; this.value = value; public int getColumn() return column; public int getValue() return value; public void setValue(int value) this.value = value; Override public int compareTo(Element o) if(columno.getColumn() return 1; else return 0; /*
17、* 将原本的value覆盖掉 * param object */ Override public void plus(Element object) this.value = this.value+object.getValue(); Override public boolean equals(Object o) if (this = o) return true; if (o = null | getClass() != o.getClass() return false; Element element = (Element) o; return column = element.col
18、umn & Objects.equals(value, element.value); /* * 用于表示矩阵中的一行 继承了多项式的链表 * Created by 74062 on 2017/4/17. */public class LinkedMatrixRow extends Multple /* * 将一个新元素添加到矩阵中,如果该位置上已经存在元素,则将其里面的数值覆盖 * param element * return */ Override public boolean add(Comparable element) Node node = findNode(element); i
19、f(node!=null) if(node!=getHead()&pareTo(E) element)=0) node.data.setValue(E) element).getValue(); else add(node,element); else add(size-1,element); return true; /* * 根据column来获得该行的元素,如果该行中column列有元素,则返回该元素,没有则返回null * param column * return */ public int getByColumn(int column) Node node
20、 = getHead().next; for(int i=0;isize;i+) if(node.data.getColumn()=column) return node.data.getValue(); node = node.next; return 0; /* * 实现两个元素的相加 * param element * return */ public boolean plus(Element element) Node node = findNode(element); if(node!=null) if(node!=getHead()&pareTo(elem
21、ent)=0) node.data.plus(element); else add(node,element); else add(size-1,element); return true; /* * 将一行相加 * param linkedMatrixRow * return */ public boolean plus(LinkedMatrixRow linkedMatrixRow) Node node = linkedMatrixRow.getHead().next; for(int i=0;ilinkedMatrixRow.size;i+) plus(node.data); node
22、= node.next; return true; /* * 稀疏矩阵 * Created by 74062 on 2017/4/16. */public class LinkedMatrix private int row; private int column; private ListLinkedMatrixRow rowList; public ListLinkedMatrixRow getRowList() return rowList; public LinkedMatrix(int row, int column) this.row = row; this.column = co
23、lumn; rowList = new ArrayList(row); for(int i=0;irow;i+) rowList.add(new LinkedMatrixRow(); public int getRow() return row; public int getColumn() return column; /* * 设置row, column位置上的元素 * param row * param column * param data */ public void setElement(int row,int column, int data) if(row0|columnthi
24、s.row|columnthis.column) throw new IllegalArgumentException(row,column超出范围); MyList list = rowList.get(row); list.add(new Element(column,data); /* * 获取row行,column列上的值 * param row * param column * return */ public int getElement(int row,int column) return rowList.get(row).getByColumn(column); public
25、static boolean isDownTri(LinkedMatrix linkedMatrix) int row = linkedMatrix.getRow(); int column = linkedMatrix.getColumn(); /先判断行列相不相等 if(column!=row) throw new IllegalArgumentException(矩阵的行列不相等); for(int j=0;jcolumn;j+) for(int i=j+1;irow;i+) if(linkedMatrix.getElement(i,j)=0) return false; return
26、true; public static boolean isUpTri(LinkedMatrix linkedMatrix) int row = linkedMatrix.getRow(); int column = linkedMatrix.getColumn(); if(column!=row) throw new IllegalArgumentException(矩阵的行列不相等); for(int i=0;irow;i+) for(int j=i+1;jcolumn;j+) if(0 = linkedMatrix.getElement(i, j) return false; retur
27、n true; /* * 判断是不是对称矩阵 * return */ public static boolean isSymmetry(LinkedMatrix linkedMatrix) int row = linkedMatrix.getRow(); ListLinkedMatrixRow rowList = linkedMatrix.getRowList(); for(int i=0;irow;i+) LinkedMatrixRow list = rowList.get(i); if(!list.isEmpty() for (int j = 0; j list.size(); j+) /
28、获取第i行的第j个元素 j不不代表列的位置 只是用来表示该行元素的顺序 Element element = (Element) list.getNode(j).data; /获取element的列位置 int column = element.getColumn(); /获取对称元素的那一行 LinkedMatrixRow symmetryList = rowList.get(column); /根据列位置来得到对称元素 int symmetryElement = symmetryList.getByColumn(i); if(symmetryElement=0) return false;
29、if (element.getValue()!=symmetryElement) return false; return true; /* * 将两个矩阵相乘 * param linkedMatrix * return */ public LinkedMatrix multiply(LinkedMatrix linkedMatrix) if(column!=linkedMatrix.row) throw new IllegalArgumentException(行列不匹配,无法相乘); /获取参数linkedMatrix中的链表 ListLinkedMatrixRow tempRowList
30、 = linkedMatrix.getRowList(); /声明一个返回矩阵 LinkedMatrix tempLinkedMatrix = new LinkedMatrix(row,linkedMatrix.column); for(int i=0;itempLinkedMatrix.row;i+) /获取this的第i行 LinkedMatrixRow linkedMatrixLine = rowList.get(i); /如果该行不是全0行则继续 if(linkedMatrixLine!=null) for(int j=0;jtempLinkedMatrix.column;j+) in
31、t sum = 0; /挨个获取第i行中的元素 for (int k = 0; k linkedMatrixLine.size(); k+) Element element = (Element) linkedMatrixLine.getNode(k).data; int value = element.getValue(); int column = element.getColumn(); /根据矩阵相乘的规律,获得第column行第j列的元素 int element1 = tempRowList.get(column).getByColumn(j); if (element1 != 0)
32、 sum += value * element1; if (sum != 0) tempLinkedMatrix.setElement(i, j, sum); this.rowList = tempLinkedMatrix.rowList; return this; /* * 将this对象转化为Matrix类 * return */ private Matrix toMatrix() Matrix matrix = new Matrix(row,column); for(int i=0;irow;i+) MyList list = rowList.get(i); for(int j=0;jl
33、ist.size();j+) Element element = list.getNode(j).data; matrix.setElement(i,element.getColumn(),element.getValue(); return matrix; /* * 将 linkedMatrix 转化为Matrix * param linkedMatrix * return */ public static Matrix toMatrix(LinkedMatrix linkedMatrix) int row = linkedMatrix.row; int column = linkedMat
34、rix.column; Matrix matrix = new Matrix(row,column); for(int i=0;irow;i+) MyList list = (MyList) linkedMatrix.rowList.get(i); for(int j=0;jlist.size();j+) Element element = list.getNode(j).data; matrix.setElement(i,element.getColumn(),(int)element.getValue(); return matrix; /* * 将matrix类转化为linkedMatr
35、ix类 * param matrix * return */ public LinkedMatrix toLinkedMatrix(Matrix matrix) int row = matrix.getRow(); int column = matrix.getColumn(); LinkedMatrix linkedMatrix = new LinkedMatrix(row,column); for(int i=0;irow;i+) for(int j=0;jcolumn;j+) if(matrix.getElement(i,j)!=0) linkedMatrix.setElement(i,
36、 j, matrix.getElement(i, j); return linkedMatrix; Override public String toString() Matrix matrix = toMatrix(); return matrix.toString(); Override public boolean equals(Object o) if (this = o) return true; if (o = null | getClass() != o.getClass() return false; if(row != (LinkedMatrix) o).row| column != (LinkedMatrix) o).column) return false; LinkedMatrix linkedMatrix = (LinkedMatrix)o; for(int i=0;irow;i+) if(!(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024农产品订购合同
- 2024年广西古建施工承揽合同模板
- 2024年人力资源服务保密协议
- 2024年度城市轨道交通安全监控系统合同
- 2024年建筑内架搭建专业承包合同
- 2024年度产品研发与技术服务合同
- 2024不能强迫续订劳动合同
- 2024年度赠与合同
- 2024年废旧物品回收处理协议
- 2024商铺租赁合同适用于各类商业街、购物中心店铺
- 航站楼管理部《机场使用手册》实施细则
- 脑卒中基本知识课件
- 高效沟通与管理技能提升课件
- 消防维保方案 (详细完整版)
- 四年级上册英语课件- M3U1 In the school (Period 3 ) 上海牛津版试用版(共15张PPT)
- 档案馆建设标准
- 高边坡支护专家论证方案(附有大量的图件)
- 苏教版五年级上册数学试题-第一、二单元 测试卷【含答案】
- 人员定位矿用井口唯一性检测系统
- 电力系统数据标记语言E语言格式规范CIME
- 历史纪年与历史年代的计算方法
评论
0/150
提交评论