《实验5特殊矩阵的存储和运算.doc》由会员分享,可在线阅读,更多相关《实验5特殊矩阵的存储和运算.doc(18页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流实验5 特殊矩阵的存储和运算.精品文档.实验报告五 特殊矩阵和广义表的存储和运算班级: 姓名: 学号: 专业: 一、 实验目的:1、 了解多维数组的存储方式和存取特点2、 熟悉稀疏矩阵的存储方式3、 用三元组法实现稀疏矩阵的相、减、转置算法。二、 实验内容:1、 在矩阵类Matrix中,增加下列操作:1) 判断一个矩阵是否为上(下)三角矩阵、对称矩阵。2) 判断两个矩阵是否相等。3) 计算两个矩阵的乘积。算法原代码:public class Matrix private int matrix; private int row; private
2、 int column; public Matrix(int matrix) row = 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 introwco
3、lumn; /* * 判断上三角 * param matrix * return */ public 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; /* * 判
4、断下三角 * param matrix * return */ public static 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; /* *
5、 判断matrix是不是对称矩阵 * param matrix * return */ public 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 *
6、/ public static boolean equals(Matrix matrix1, 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; /* *
7、 将两个矩阵相乘 * param TemPMatrix * return */ public 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;k
8、column;k+) sum += (this.matrixik)*(TemPMatrix.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 intr
9、owcolumn; for(int i=0;irow;i+) for(int j=0;jcolumn;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
10、 != matrix1.row) return false; if (column != 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() retu
11、rn row; public int getColumn() return column; 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 Ma
12、trix(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); 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
13、,3,0,0,1,2,3,4,0,1,2,3,4,5); System.out.println(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是否是下三角:+
14、Matrix.isDownTri(matrix2); System.out.println(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();
15、 System.out.println(matrix1*matrix2); System.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 Comparabl
16、e,IPlus private int column; private int value; 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(col
17、umno.getColumn() return 1; else return 0; /* * 将原本的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 eleme
18、nt = (Element) o; return column = element.column & Objects.equals(value, element.value); /* * 用于表示矩阵中的一行 继承了多项式的链表 * Created by 74062 on 2017/4/17. */public class LinkedMatrixRow extends Multple /* * 将一个新元素添加到矩阵中,如果该位置上已经存在元素,则将其里面的数值覆盖 * param element * return */ Override public boolean add(Compara
19、ble element) Node node = findNode(element); if(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 g
20、etByColumn(int column) Node node = 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!=ge
21、tHead()&pareTo(element)=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+) plu
22、s(node.data); node = 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 = ro
23、w; this.column = column; 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
24、) if(row0|columnthis.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).getByColu
25、mn(column); public 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) re
26、turn false; return 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)
27、return false; return 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
28、 list.size(); j+) /获取第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(symmetryElemen
29、t=0) return false; if (element.getValue()!=symmetryElement) return false; return true; /* * 将两个矩阵相乘 * param linkedMatrix * return */ public LinkedMatrix multiply(LinkedMatrix linkedMatrix) if(column!=linkedMatrix.row) throw new IllegalArgumentException(行列不匹配,无法相乘); /获取参数linkedMatrix中的链表 ListLinkedMa
30、trixRow tempRowList = 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;jtempLinkedM
31、atrix.column;j+) int 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) 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
限制150内