矩阵类:二维数组实现!!
每一行看成一个一维数组,在放入几个集合里面即可;
用到random类,可以生产随机数,括号里是最大值;
矩阵类: public class MyMatrix { int[][] matrix ;//矩阵数组 Random random =new Random() ;//随机数对象 //默认的构造方法,生成3*3的矩阵 public MyMatrix() { //默认是3*3矩阵 matrix = new int[3][3]; //初始矩阵 for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { matrix[i][j]=random.nextInt(100); } } } //生成方阵的构造方法 public MyMatrix(int n) { matrix = new int[n][n]; //初始矩阵 for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { matrix[i][j]=random.nextInt(100); } } } //生成一个m*n的矩阵。 public MyMatrix(int m,int n) { matrix = new int[m][n]; //初始矩阵 for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { matrix[i][j]=random.nextInt(100); } } } //根据已知二维数组,生成矩阵 public MyMatrix(int[][] matrix) { this.matrix = matrix; } //返回矩阵数组 public int[][] getMatrix() { return this.matrix; } //打印矩阵 public void print() { for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { System.out.print(matrix[i][j]+" "); } System.out.println(); } } //转置矩阵 public MyMatrix transport() { //行变列 int m = matrix[0].length; //列变行 int n = matrix.length; MyMatrix transMatrix = new MyMatrix(m,n); //初始化 //这里遍历新的矩阵,把原矩阵对称点放置进来 for(int i=0;i<transMatrix.matrix.length;i++) { for(int j=0;j<transMatrix.matrix[i].length;j++) { transMatrix.matrix[i][j] = matrix[j][i]; } } return transMatrix; } //判断矩阵是否是上三角矩阵 public boolean isUpTriangle() { for(int i=1;i<matrix.length;i++) { for(int j=0;j<i;j++) { if(matrix[i][j]!=0) { return false; } } } return true; } //判断是否是下三角矩阵 public boolean isDownTriangle() { for(int i=0;i<matrix.length;i++) { for(int j=matrix[i].length-1;j>i;j--) { if(matrix[i][j]!=0) { return false; } } } return true; } //判断是否是对称矩阵 public boolean isSynmetry() { for(int i=1;i<matrix.length;i++) { //这里可以j<i即可,因为只查看一半即可,这样会重复 for(int j=0;j<matrix[i].length;j++) { if(matrix[i][j]!=matrix[j][i]) { return false; } } } return true; } //矩阵求和 public void add(MyMatrix b) { int m = b.matrix.length; int n = b.matrix[0].length; if(m!=matrix.length||n!=matrix[0].length) { System.out.println("矩阵类型不相同,无法相加!"); } else { for(int i=0;i<matrix.length;i++) { for(int j=0;j<matrix[i].length;j++) { matrix[i][j]+=b.matrix[i][j]; } } } } }
对称矩阵的压缩算法:
把下三角或者上三角存在一维数组中;
把二维数组中的数据三角式的一行一行的存在一维数组中,取出时,对应n*n循环,找出一维数组中的位置对应数据存在二维数组中,即为二维数组。
//对称矩阵类压缩 public class SynmeMatrix { //a用来存储矩阵的副本 double [] a;//矩阵元素 int n; //矩阵的阶数; int m; //一维数组的个数 public SynmeMatrix(int n) { //需要保持的元素个数是m=n*(n+1)/2 ; //这里要注意m的大小 m = n*(n+1)/2 ; a = new double[m]; this.n = n; } //通过一个二维数组来初始化 public void evaluate(double[][] b) { int k=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i>=j) { //System.out.println("a["+k+"]="+b[i][j]); //把b中的数据存到a这个副本中 //因为是对称阵,三角式的一行一行的存里面,这样起到节省空间的作用 a[k++]=b[i][j]; //只保存下三角元素 } } } } //通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的副本 //b为副本,传进来,因此与a相等 public void evaluate(double[] b) { for(int k=0;k<m;k++) { a[k]= b[k]; } } //对称矩阵相加 public SynmeMatrix add(SynmeMatrix b) { SynmeMatrix t = new SynmeMatrix(n); int k; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { //k是指副本中的位置,根据i和j找到对应该位置的值,两个synmeMatrix相同,因此具有的规则一样 if(i>=j) { k= i*(i-1)/2+j-1; } else { k= j*(j-1)/2+i-1; } t.a[k] = a[k]+b.a[k]; } } return t; } //打印对称矩阵 public void print() { int k; //存的是副本,是一维数组,因此可以从二维数据的位置坐标找到一位数组中对应的位置的数据,即为二维数组中的数据 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i>=j) { k= i*(i-1)/2+j-1; } else { k= j*(j-1)/2+i-1; } System.out.print(" "+a[k]); } System.out.println(); } } }
稀疏矩阵压缩算法:
只存储数据的位置和元素,用三元组存储;
三元组的存储结构可以用一维数组或者链表结构;
这里用到了前面的MyVector集合存储非零数据信息;
下面是用数组的结构建立的系数矩阵;
//三元组类,非零元素的信息,行、列、数据 //每个节点都是一个数据点 public class Three { public int row; public int col; public double value; public Three(int r,int c,double v) { this.row = r; this.col = c; this.value = v; } public Three() { this(0,0,0.0); } } //稀疏矩阵类 //需要行和列,以及非零元素个数和位置即可 public class SpaMatrix { int rows; //行数 int cols; //列数 int dNum;//非零元素个数 //v是存非零元素的集合,v中的顺序不重要,因为都是相互独立的 MyVector v; SpaMatrix(int max) { rows = cols = dNum=0; v = new MyVector(max); } //根据用户传来的三元组数组,来初始化矩阵 public void evaluate(int r,int c,int d,Three[] item)throws Exception { this.rows = r; this.cols = c; this.dNum = d; for(int i=0;i<d;i++) { v.add(i, item[i]); } } //稀疏矩阵的转置 public SpaMatrix transport()throws Exception { //稀疏矩阵只需要非零元素的位置和数据,因此构建时传入v的大小即可; SpaMatrix a = new SpaMatrix(v.size()); a.rows = this.cols; a.cols = this.rows; a.dNum = this.dNum; for(int i=0;i<dNum;i++) { Three t = (Three)v.get(i); a.v.add(i, new Three(t.col,t.row,t.value)); } return a; } //打印稀疏矩阵的方法 public void print() throws Exception { System.out.println("矩阵的行数:"+this.rows); System.out.println("矩阵的列数:"+this.cols); System.out.println("非零元素个数:"+this.dNum); System.out.println("矩阵三元组为:"); for(int i=0;i<dNum;i++) { System.out.println("a<"+((Three)v.get(i)).row+","+((Three)v.get(i)).col+">="+((Three)v.get(i)).value); } } }
也可用链表结构实现:
图片不清楚,文字说明:每个节点都存位置信息,数据信息和下一个节点位置,这种方法不是很好。
数组与链式结构相结合:
图片不清楚,文字说明:这种方法比较好的地方就是很清晰,数组记录行,后面的链表记录该行内列的信息,依次连接。
时间: 2024-10-29 03:16:05