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

矩阵类

矩阵是工程设计中经常使用的数学工具。
矩阵的运算主要有矩阵加、矩阵减、矩阵乘、矩阵转置、矩阵求逆等。
矩阵用两维数组处理最为方便。
二维数组存储结构。  

设计矩阵类
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值