实验5特殊矩阵的存储和运算.docx
- 文档编号:28684302
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:21
- 大小:95.40KB
实验5特殊矩阵的存储和运算.docx
《实验5特殊矩阵的存储和运算.docx》由会员分享,可在线阅读,更多相关《实验5特殊矩阵的存储和运算.docx(21页珍藏版)》请在冰豆网上搜索。
实验5特殊矩阵的存储和运算
实验报告五特殊矩阵和广义表的存储和运算
班级:
姓名:
学号:
专业:
一、实验目的:
1、了解多维数组的存储方式和存取特点
2、熟悉稀疏矩阵的存储方式
3、用三元组法实现稀疏矩阵的相、减、转置算法。
二、实验内容:
1、在矩阵类Matrix中,增加下列操作:
1)判断一个矩阵是否为上(下)三角矩阵、对称矩阵。
2)判断两个矩阵是否相等。
3)计算两个矩阵的乘积。
算法原代码:
publicclassMatrix{
privateint[][]matrix;
privateintrow;
privateintcolumn;
publicMatrix(int[][]matrix){
row=matrix.length;
column=matrix[0].length;
this.matrix=newint[row][column];
for(inti=0;i for(intj=0;j this.matrix[i][j]=matrix[i][j]; } } } publicMatrix(introw,intcolumn){ this.row=row; this.column=column; matrix=newint[row][column]; } /** *判断上三角 *@parammatrix *@return */ publicstaticbooleanisUpTri(Matrixmatrix){ if(matrix.column! =matrix.row){ thrownewIllegalArgumentException("矩阵的行列不相等"); } for(inti=0;i for(intj=i+1;j if(0==matrix.getElement(i,j)){ returnfalse; } } } returntrue; } /** *判断下三角 *@parammatrix *@return */ publicstaticbooleanisDownTri(Matrixmatrix){ //先判断行列相不相等 if(matrix.column! =matrix.row){ thrownewIllegalArgumentException("矩阵的行列不相等"); } for(intj=0;j for(inti=j+1;i if(matrix.getElement(i,j)==0){ returnfalse; } } } returntrue; } /** *判断matrix是不是对称矩阵 *@parammatrix *@return */ publicstaticbooleanisSymmetry(Matrixmatrix){ for(inti=0;i for(intj=i+1;j if(matrix.getElement(i,j)! =matrix.getElement(j,i)){ returnfalse; } } } returntrue; } /** *判断两个矩阵是否相等 *@parammatrix1 *@parammatrix2 *@return */ publicstaticbooleanequals(Matrixmatrix1,Matrixmatrix2){ if(matrix1.getRow()! =matrix2.getRow()||matrix1.getColumn()! =matrix2.getColumn()){ returnfalse; } for(inti=0;i for(intj=0;j if(matrix1.getElement(i,j)! =matrix2.getElement(i,j)){ returnfalse; } } } returntrue; } /** *将两个矩阵相乘 *@paramTemPMatrix *@return */ publicMatrixmultiply(MatrixTemPMatrix){ if(column! =TemPMatrix.row){ thrownewIllegalArgumentException("行列不匹配,两个矩阵无法相乘"); } Matrixmatrix1=newMatrix(row,TemPMatrix.column); for(inti=0;i for(intj=0;j intsum=0; for(intk=0;k sum+=(this.matrix[i][k])*(TemPMatrix.getElement(k,j)); } matrix1.setElement(i,j,sum); } } returnmatrix1; } /** *两个矩阵相加 *@parammatrix *@return */ publicMatrixplus(Matrixmatrix){ if(row! =matrix.getRow()&&column! =matrix.getColumn()){ thrownewIllegalArgumentException("行列不匹配"); } int[][]tempMatrix=newint[row][column]; for(inti=0;i for(intj=0;j tempMatrix[i][j]=this.matrix[i][j]+matrix.getElement(i,j); } } returnnewMatrix(tempMatrix); } @Override publicbooleanequals(Objecto){ if(this==o)returntrue; if(o==null||getClass()! =o.getClass())returnfalse; Matrixmatrix1=(Matrix)o; if(row! =matrix1.row)returnfalse; if(column! =matrix1.column)returnfalse; returnArrays.deepEquals(matrix,matrix1.matrix); } publicvoidsetElement(introw,intcolumn,intelement){ matrix[row][column]=element; } publicintgetElement(introw,intcolumn){ returnmatrix[row][column]; } publicintgetRow(){ returnrow; } publicintgetColumn(){ returncolumn; } @Override publicStringtoString(){ Stringstring=newString(); for(inti=0;i for(intj=0;j string+=matrix[i][j]+""; } string+="\n"; } returnstring; } } publicclassTest{ publicstaticvoidmain(String[]args)throwsException{ Matrixmatrix1=newMatrix(newint[][]{{1,0,0,0,0},{1,2,0,0,0},{1,2,3,0,0},{1,2,3,4,0},{1,2,3,4,5}}); Matrixmatrix2=newMatrix(newint[][]{{1,2,3,4,5},{0,2,3,4,5},{0,0,3,4,5},{0,0,0,4,5},{0,0,0,0,5}}); Matrixmatrix3=newMatrix(newint[][]{{1,2,3,4,5},{2,1,6,7,8},{3,6,1,9,10},{4,7,9,1,11},{5,8,10,11,1}}); Matrixmatrix4=newMatrix(newint[][]{{1,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.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是否是下三角: "+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(); System.out.println("matrix1*matrix2"); System.out.println(matrix1.multiply(matrix2)); } } 测试结果如下: 2、在三元组行的单链表表示的稀疏矩阵类LinkedMatrix中,增加判断矩阵相等、判断对称矩阵、计算矩阵乘积等操作。 算法源代码: publicinterfaceIPlus publicvoidplus(Eobject); } /** *用于表示稀疏矩阵中的元素 *Createdby74062on2017/4/16. */ publicclassElementimplementsComparable privateintcolumn; privateintvalue; publicElement(intcolumn,intvalue){ this.column=column; this.value=value; } publicintgetColumn(){ returncolumn; } publicintgetValue(){ returnvalue; } publicvoidsetValue(intvalue){ this.value=value; } @Override publicintcompareTo(Elemento){ if(column return-1; }elseif(column>o.getColumn()) return1; else return0; } /** *将原本的value覆盖掉 *@paramobject */ @Override publicvoidplus(Elementobject){ this.value=this.value+object.getValue(); } @Override publicbooleanequals(Objecto){ if(this==o)returntrue; if(o==null||getClass()! =o.getClass())returnfalse; Elementelement=(Element)o; returncolumn==element.column&& Objects.equals(value,element.value); } } /** *用于表示矩阵中的一行继承了多项式的链表 *Createdby74062on2017/4/17. */ publicclassLinkedMatrixRow /** *将一个新元素添加到矩阵中,如果该位置上已经存在元素,则将其里面的数值覆盖 *@paramelement *@return */ @Override publicbooleanadd(Comparableelement){ Node 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); returntrue; } /** *根据column来获得该行的元素,如果该行中column列有元素,则返回该元素,没有则返回null *@paramcolumn *@return */ publicintgetByColumn(intcolumn){ Node for(inti=0;i if(node.data.getColumn()==column){ returnnode.data.getValue(); } node=node.next; } return0; } /** *实现两个元素的相加 *@paramelement *@return */ publicbooleanplus(Elementelement){ Node if(node! =null){ if(node! =getHead()&&pareTo(element)==0){ node.data.plus(element); }else{ add(node,element); } }else add(size-1,element); returntrue; } /** *将一行相加 *@paramlinkedMatrixRow *@return */ publicbooleanplus(LinkedMatrixRowlinkedMatrixRow){ Node for(inti=0;i plus(node.data); node=node.next; } returntrue; } } /** *稀疏矩阵 *Createdby74062on2017/4/16. */ publicclassLinkedMatrix privateintrow; privateintcolumn; privateList publicList returnrowList; } publicLinkedMatrix(introw,intcolumn){ this.row=row; this.column=column; rowList=newArrayList<>(row); for(inti=0;i rowList.add(newLinkedMatrixRow<>()); } } publicintgetRow(){ returnrow; } publicintgetColumn(){ returncolumn; } /** *设置row,column位置上的元素 *@paramrow *@paramcolumn *@paramdata */ publicvoidsetElement(introw,intcolumn,intdata){ if(row<0||column<0||row>this.row||column>this.column){ thrownewIllegalArgumentException("row,column超出范围"); } MyList list.add(newElement(column,data)); } /** *获取row行,column列上的值 *@paramrow *@paramcolumn *@return */ publicintgetElement(introw,intcolumn){ returnrowList.get(row).getByColumn(column); } publicstaticbooleanisDownTri(LinkedMatrixlinkedMatrix){ introw=linkedMatrix.getRow(); intcolumn=linkedMatrix.getColumn(); //先判断行列相不相等 if(column! =row){ thrownewIllegalArgumentException("矩阵的行列不相等"); } for(intj=0;j for(inti=j+1;i if(linkedMatrix.getElement(i,j)==0){ returnfalse; } } } returntrue; } publicstaticbooleanisUpTri(LinkedMatrixlinkedMatrix){ introw=linkedMatrix.getRow(); intcolumn=linkedMatrix.getColumn(); if(column! =row){ thrownewIllegalArgumentException("矩阵的行列不相等"); } for(inti=0;i for(intj=i+1;j if(0==linkedMatrix.getElement(i,j)){ returnfalse; } } } returntrue; } /** *判断是不是对称矩阵 *@return */ publicstaticbooleanisSymmetry(LinkedMatrixlinkedMatrix){ introw=linkedMatrix.getRow(); List for(inti=0;i LinkedMatrixRow if(! list.isEmpty()){ for(intj=0;j //获取第i行的第j个元素j不不代表列的位置只是用来表示该行元素的顺序 Elementelement=(Element)list.getNode(j).data; //获取element的列位置 intcolumn=element.getColumn(); //获取对称元素的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验5 特殊矩阵的存储和运算 实验 特殊 矩阵 存储 运算
![提示](https://static.bdocx.com/images/bang_tan.gif)