当前位置:编程学习 > JAVA >>

特殊矩阵

          关于对特殊矩阵的理解
概念:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵
      对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵,而对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。
一、特殊矩阵
  分类:
1、  对角矩阵(diagonal):M是一个对角矩阵当且仅当i!=j时有M(i,j)=0,如:
2   0   0   0
0   1   0   0
0   0   4   0
0   0   0   6
2、  三对角矩阵(tridiagonal):M是一个对三角矩阵当且仅当|i-j| >1时有M(i,j)= 0,如:
2   1   0   0
3   1   3   0
0   5   2   7
0   0   9   0
 
3、  下三角矩阵(lower tridiagonal):M是一个下三角矩阵当且仅当I <j时有m(i,j)=0.如:
2   0   0   0
5   1   0   0
4   3   1   0
4   2   7   0
 
4、  上三角矩阵(upper tridiagonal):M是一个上三角矩阵当且仅当I >j时有m(i,j)=0如:
2   1   3   1
0   1   3   8
0   0   1   6
0   0   0   7
 
5、  对称矩阵(symmetric):M是一个下对称矩阵当且仅当对于所有的i和j有m(i,j)=M(j,i)如:
2   4   6   0
4   1   9   5
6   9   4   7
0   5   7   0
注:对称矩阵又叫对称方阵:在一个n阶方阵A中,若元素满足Aij=Aji (0<=I,j<=n-1)则称其为n阶对称方阵。
 
特殊矩阵的压缩存储:
矩阵中相同的元素只分配一个存储空间,零元素不存储。
由于对称矩阵中的元素是关于主对角线对称的,为了节省空间,可以为每一对称元素只分配一个存储空间,存储时只存储对称矩阵中的上三角或者下三角中的元素。这样存储单元的总数是:
              n*(n+1)/2----------------包含对角线上的元素时
K=
             n*(n-1)/2----------------不包含对角线上的元素时
 
可以以行序为主进行压缩存储,也可以以列徐为主进行压缩存储。假设以行序为主进行压缩存储,可以用一个一位数组b[n*(n+1)/2]或者b[n*(n-1)/2]作为n阶对称矩阵A的存储结构,则b[k]和矩阵Aij之间存在如下对应关系:
              i*(i+1)/2+j--------------当i>=j时
      K=                                             ---------------存储对角线上的元素时
             j*(j+1)/2+i--------------当I < j时
 
 
              i*(i-1)/2+j--------------当i>=j时
      K=                                             ---------------不存储对角线上的元素时
             j*(j-1)/2+i--------------当I < j时
 
 下面用特殊矩阵的压缩存储来解决一个实际问题:
[java]
package D0711; 
 
/*
 * 特殊矩阵的压缩存储---解决查询城市间距离的问题
 * 
 * 问题描述:六个城市分别为GN、JX、MI、OD、TL、TM
 * 将这六个城市从1-6进行编号。任意两个城市之间的距离可以用一个6*6的矩阵来表示。
 * 矩阵的第i行和第i列代表第i个城市,distance(i,j)代表城市i和城市j之间的额距离。
 * 由于对于所有的i和j有distance(i,j)=distance(j,i),所以该举证是一个对称矩阵。
 * 根据该矩阵的特点,编程实现如下要求:
 * 1、两个城市之间的额距离只存储一次,自己到自己的距离不要存储。
 * 2、当用户任意输入两个城市的名字,将显示这两个城市之间的距离。
 *     GN   JX   MI   OD   TL   TM
 * GN  0    73   333  114  148  129
 * JX  73   0    348  140  163  194
 * MI  333  348  0    229  468  250
 * OD  114  140  229  0    251  84
 * TL  148  163  468  251  0    273
 * TM  129  194  250  84   273  0
 *
 * 
 * 
 * 分析:
 * 城市距离矩阵不用存储对角线元素,可用一个6*(6-1)/2 =15个数据元素的一位数组来存储
 * */ 
import java.util.*; 
 
public class CityDistance { 
 
    public static void main(String[] args) { 
        int[] distance; 
        String[] cityName = new String[] { "GN", "JX", "MI", "OD", "TL", "TM" }; 
        int n, k; 
        int i = 0, j = 0; 
        System.out.println("请输入城市的数目:"); 
        Scanner sc = new Scanner(System.in); 
        n = sc.nextInt(); 
        k = n * (n - 1) / 2;// 不要存储对角线元素 
        distance = new int[k]; 
        System.out.println(" 请输入城市矩阵的下三角矩阵"); 
        for (int m = 0; m < k; m++) { 
            distance[m] = sc.nextInt(); 
        } 
        String temp; 
        System.out.println(" 请输入开始城市简写名称:"); 
        temp = sc.next(); 
        for (int m = 0; m < n; m++) { 
            if (cityName[m].equals(temp)) { 
                i = m; 
                break; 
            } 
        } 
        String flag = ""; 
        do { 
            System.out.println("请输入目标城市简
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,