(十四)矩阵类与对称矩阵的压缩算法
来源:互联网 发布:双防火墙网络环境搭建 编辑:程序博客网 时间:2024/06/05 18:20
矩阵类
矩阵是工程设计中经常使用的数学工具。
矩阵的运算主要有矩阵加、矩阵减、矩阵乘、矩阵转置、矩阵求逆等。
矩阵用两维数组处理最为方便。
二维数组存储结构。
设计矩阵类
import java.util.Random;public class MyMatrix { int[][] matrix ;//矩阵数组Random random =new Random() ;//随机数对象//默认的构造方法,生成3*3的矩阵public MyMatrix(){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++) { 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]; } } } }}
public class TestMyMatrix {public static void main(String[] args) {MyMatrix m1 = new MyMatrix();MyMatrix m2 = new MyMatrix(4);System.out.println("m1矩阵:");m1.print();System.out.println("m2矩阵:");m2.print();MyMatrix m3 = m2.transport();System.out.println("m2转置后:");m3.print();System.out.println(m3.isDownTriangle());MyMatrix m4 = new MyMatrix( new int[][]{ {1,0,0,0}, {2,3,0,0}, {4,5,6,0}, {7,8,9,10} });System.out.println(m4.isDownTriangle());MyMatrix m5 = new MyMatrix( new int[][]{ {1,2,4,7}, {2,3,5,8}, {4,5,6,9}, {7,8,9,10} });System.out.println(m5.isSynmetry());m4.add(m5);m4.print();}}
特殊矩阵
特殊矩阵是指这样一类矩阵,其中有许多值相同的元素或有许多零元素,且值相同的元素或零元素的分布有一定规律。一般采用二维数组来存储矩阵元素。但是,对于特殊矩阵,可以通过找出矩阵中所有值相同元素的数学映射公式,只存储相同元素的一个副本,从而达到压缩存储数据量的目的。
特殊矩阵的压缩存储
只存储相同矩阵元素的一个副本。此种压缩存储方法是:找出特殊矩阵数据元素的分布规律,只存储相同矩阵元素的一个副本。
n阶对称矩阵的压缩存储对应关系
aij=aji 1<=i<=n,1<=j<=n
元素个数m = n*(n+1)/2
打印对称矩阵第i行,第j列的元素,与一维数组的下标关系为:
i*(i-1)/2+j-1 当i>=j
k=
j*(j-1)/2+i-1 当i<j
采用不等长的二维数组
Java语言支持不等长的二维数组,对于n阶对称矩阵,也可以通过只申请存储下三角(或上三角)矩阵元素所需的二维数组,来达到压缩存储的目的。
不等长的二维数组结构
//对称矩阵类public class SynmeMatrix { double [] a;//矩阵元素int n; //矩阵的阶数;int m; //一维数组的个数public SynmeMatrix(int n){//需要保持的元素个数是m=n*(n-1)/2 ;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]); a[k++]=b[i][j]; //只保存下三角元素 } } }}//通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的副本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++) { 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(); }}}
public class TestSynmeMatrix {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub SynmeMatrix m1 = new SynmeMatrix(3);SynmeMatrix m2 = new SynmeMatrix(3);SynmeMatrix m3;double[][] a ={{1,0,0},{2,3,0},{4,5,6}};double[] b = {1,2,3,4,5,6};m1.evaluate(a);m2.evaluate(b);System.out.println("m1对称矩阵:");m1.print();System.out.println("m2对称矩阵:");m2.print();m3=m1.add(m2);System.out.println("m3对称矩阵:"); m3.print(); }}
0 0
- (十四)矩阵类与对称矩阵的压缩算法
- 数据结构与算法(Java描述)-14、矩阵类以及对称矩阵的压缩算法
- 对称矩阵的压缩
- 对称矩阵的压缩存储算法
- 对称矩阵、稀疏矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- ~对称矩阵的压缩存储~
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩储存
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵与压缩存储算法(java实现)
- 对称矩阵及对称矩阵的压缩存储
- JavaScript与Java的区别:
- POJ1555解题报告
- hdu1081To The Max(dp)
- hdu 1394 树状数组
- 插APC实现DLL注入
- (十四)矩阵类与对称矩阵的压缩算法
- 温州企业家苦干1年挣百万 妻子炒房8年赚3000万
- 又一版 A+B 浙大计算机研究生复试上机考试-2008年
- 基础背包问题的一些题目!!
- struts2 标签自动提示
- 开始在CSDN上安家了哈!
- Matlab 使用小记
- equals()方法
- Spring Bean Scope