(十四)矩阵类与对称矩阵的压缩算法

来源:互联网 发布:双防火墙网络环境搭建 编辑:程序博客网 时间: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
原创粉丝点击