三角矩阵

三角矩阵的常用压缩方式有两种:

  • 线性压缩
  • 使用三角形的二维数组压缩

线性压缩存储三角矩阵

下三角矩阵:



上三角矩阵:


以下三角矩阵的线性压缩存储为例,进行实现:

package pers.zhang.array;/*** @author zhang* @date 2020/1/19 - 13:34** 下三角矩阵线性压缩存储*/
public class DownTriangleMatrix {//下三角矩阵的阶数private int rows;//存储矩阵元素的一维数组private int element[];//构造rows阶下三角矩阵public DownTriangleMatrix(int rows){if(rows <= 0)throw new IllegalArgumentException("矩阵行数非正数:" + rows);this.rows = rows;//rows阶下三角矩阵需要存储rows*(rows+1)/2个元素this.element = new int[rows * (rows + 1) / 2];}//构造rows阶下三角矩阵,初值由mat提供,mat按行主序顺序存储rows阶下三角矩阵元素public DownTriangleMatrix(int rows, int mat[]){this(rows);int n = element.length <= mat.length ? element.length : mat.length;for (int i = 0; i < n; i++)//mat元素不足时补0,忽略多余元素this.element[i] = mat[i];}//深拷贝public DownTriangleMatrix(DownTriangleMatrix mat){this(mat.rows, mat.element);}//返回矩阵第i行第j列元素值,O(1)public int get(int i, int j)      {if (i < 0 || i >= rows || j < 0 || j >= rows)throw new IndexOutOfBoundsException("矩阵元素的行或列序号越界");return i < j ? 0 : element[i * (i + 1) / 2 + j];//按线性压缩存储地址寻找矩阵元素}//设置矩阵第i行第j列元素值为value,O(1)public void set(int i, int j, int value){if (i < 0 || i >= rows || j < 0 || j >= rows)throw new IndexOutOfBoundsException("矩阵元素的行或列序号越界");this.element[i * (i + 1) / 2 + j] = value;}//返回下三角矩阵所有元素的描述字符串,行主序遍历public String toString(){String str =" 下三角矩阵" + this.getClass().getName() + "(" + this.rows + "阶):\n";for (int i = 0; i < this.rows; i++){for (int j = 0; j < this.rows; j++)str += String.format("%4d", this.get(i,j));str += "\n";}return str;}//当前下三角矩阵与mat矩阵相加,this+=mat,各对应元素相加,改变当前矩阵public void add(DownTriangleMatrix mat){if (this.rows != mat.rows)throw new IllegalArgumentException("两个矩阵阶数不同,不能相加");for (int i = 0; i < this.element.length; i++)this.element[i] += mat.element[i];}//返回当前矩阵与mat相加后的矩阵,=this+mat,各对应元素相加,不改变当前矩阵public DownTriangleMatrix plus(DownTriangleMatrix mat){DownTriangleMatrix matc = new DownTriangleMatrix(this);//深拷贝matc.add(mat);return matc;                                       //返回对象引用}//比较两个同阶矩阵是否相等public boolean equals(Object obj){if (this == obj)return true;if (!(obj instanceof DownTriangleMatrix))return false;DownTriangleMatrix mat=(DownTriangleMatrix)obj;if (this.rows != mat.rows)return false;for (int i = 0; i < this.element.length; i++)if (this.element[i] != mat.element[i])           //比较对应元素是否相等return false;return true;}
}

测试:

package pers.zhang.array;/*** @author zhang* @date 2020/1/19 - 14:00*/
public class DownTriangleMatrix_ex {public static void main(String args[]){int m1[]={1,2,3,4,5,6,7,8,9,10,11,12};DownTriangleMatrix mata=new DownTriangleMatrix(4,m1);  //忽略m1多余元素System.out.print("A"+mata.toString());int m2[]={1,0,1,0,0,1};DownTriangleMatrix matb=new DownTriangleMatrix(4,m2);  //m2元素不足时补0matb.set(3,3,1);System.out.print("B"+matb.toString());DownTriangleMatrix matc = mata.plus(matb);System.out.print("C=A+B"+mata.plus(matb).toString());mata.add(matb);System.out.println("A+=B"+mata.toString());System.out.println("C.equals(A)?"+matc.equals(mata));}
}
/*
A 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶):1   0   0   02   3   0   04   5   6   07   8   9  10
B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶):1   0   0   00   1   0   00   0   1   00   0   0   1
C=A+B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶):2   0   0   02   4   0   04   5   7   07   8   9  11
A+=B 下三角矩阵pers.zhang.array.DownTriangleMatrix(4阶):2   0   0   02   4   0   04   5   7   07   8   9  11C.equals(A)?true*/

使用三角形的二维数组压缩存储三角矩阵

下三角矩阵:

上三角矩阵:

实现:

package pers.zhang.array;/*** @author zhang* @date 2020/1/19 - 14:17** 三角矩阵的二维数组压缩存储*/
public class TriangleMatrix {//上或下三角矩阵标识private boolean up;//三角形的二维数组存储矩阵非零元素private int element[][];//构造rows阶零矩阵,up为true时上三角矩阵public TriangleMatrix(int rows, boolean up){this.up = up;this.element = new int[rows][];//若rows<0,Java将抛出负数组长度异常NegativeArraySizeExceptionif (up)//上三角矩阵for (int i = 0; i< this.element.length; i++)this.element[i] = new int[rows-i];//数组元素初值为0else                                               //下三角矩阵for (int i = 0; i < this.element.length; i++)this.element[i] = new int[i+1];}//构造rows阶矩阵,由二维数组mat提供元素public TriangleMatrix(int rows, boolean up, int mat[][]){this(rows, up);for (int i = 0; i < mat.length && i < this.element.length; i++) //mat元素不足时补0,忽略多余元素for (int j = 0; j < mat[i].length && j < this.element[i].length; j++)this.element[i][j] = mat[i][j];}//深拷贝public TriangleMatrix(TriangleMatrix mat){this(mat.element.length, mat.up, mat.element);}//返回矩阵第i行第j列元素值,O(1)public int get(int i, int j){if (up)return i>j ? 0 : this.element[i][j-i];elsereturn i<j ? 0 : this.element[i][j];//若i、j下标越界,Java将抛出数组下标越界异常ArrayIndexOutOfBoundsException}//设置矩阵第i行第j列的元素值为value,O(1)public void set(int i, int j, int value){if (up)this.element[i][j - i] = value;elsethis.element[i][j] = value;}//行主序遍历,访问矩阵全部元素public String toString(){String str = " " + this.getClass().getName() + "(" + this.element.length + "阶):\n";for (int i = 0; i < this.element.length; i++){for (int j = 0; j < this.element.length; j++)str += String.format("%4d", this.get(i,j));str += "\n";}return str;}//当前矩阵与mat矩阵相加,this+=mat,各对应元素相加,改变当前矩阵public void add(TriangleMatrix mat){if (this.element.length != mat.element.length)throw new IllegalArgumentException("两个矩阵阶数不同,不能相加"); //抛出无效参数异常if (this.up != mat.up)throw new IllegalArgumentException("该类不支持上三角矩阵与下三角矩阵相加");for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)this.element[i][j] += mat.element[i][j];}//返回当前矩阵与mat相加后的矩阵,不改变当前矩阵,=this+mat,各对应元素相加public TriangleMatrix plus(TriangleMatrix mat){TriangleMatrix matc = new TriangleMatrix(this);      //深拷贝matc.add(mat);return matc;                                       //返回对象引用}//比较两个同阶矩阵是否相等@Overridepublic boolean equals(Object obj){if (this == obj)return true;if (!(obj instanceof TriangleMatrix))return false;TriangleMatrix mat = (TriangleMatrix)obj;if (this.element.length != mat.element.length || this.up!=mat.up)return false;for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)if (this.element[i][j] != mat.element[i][j]) //比较对应元素是否相等return false;return true;}//返回当前矩阵的转置矩阵public TriangleMatrix transpose(){TriangleMatrix trans = new TriangleMatrix(this.element.length, !this.up);//构造零矩阵if (up)                                            //上三角矩阵转置为下三角矩阵for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)trans.element[j + i][i] = this.element[i][j];else                                               //下三角矩阵转置为上三角矩阵for (int i = 0; i < this.element.length; i++)for (int j = 0; j < this.element[i].length; j++)trans.element[j][i - j] = this.element[i][j];return trans;                                      //返回对象引用}
}

测试:

package pers.zhang.array;/*** @author zhang* @date 2020/1/19 - 15:54*/
public class TriangleMatrix_ex {public static void main(String args[]){int m1[][]={{1,2,3,4},{5,6,7},{8,9},{10}};TriangleMatrix mata=new TriangleMatrix(4,true,m1);                    //矩阵对象,初值不足时自动补0,忽略多余元素System.out.print("A"+mata.toString());TriangleMatrix matb=new TriangleMatrix(4,true);matb.set(0,0,1);matb.set(0,3,1);matb.set(1,1,1);matb.set(3,3,1);System.out.print("B"+matb.toString());TriangleMatrix matc = mata.plus(matb);System.out.print("C=A+B"+matc.toString());mata.add(matb);System.out.print("A+=B"+mata.toString());System.out.println("C.equals(A)?"+matc.equals(mata));int m2[][]={{1},{2,3},{4,5,6},{7,8,9,10}};TriangleMatrix matd=new TriangleMatrix(4,false,m2);      //矩阵对象,初值不足时自动补0,忽略多余元素System.out.print("\nD"+matd.toString());TriangleMatrix mate=new TriangleMatrix(4,false);mate.set(0,0,1);mate.set(1,1,1);mate.set(3,0,1);mate.set(3,3,1);System.out.print("E"+mate.toString());TriangleMatrix matf = matd.plus(mate);System.out.print("F=D+E"+matf.toString());matd.add(mate);System.out.print("D+=E"+matd.toString());System.out.println("F.equals(D)?"+matc.equals(mata));System.out.println("B.equals(E)?"+matb.equals(mate)+"\n");TriangleMatrix matg = matb.transpose();System.out.print("B的转置矩阵G"+matg.toString());System.out.println("G.equals(E)?"+matg.equals(mate)+"\n");TriangleMatrix math = mate.transpose();System.out.print("E的转置矩阵H"+math.toString());System.out.println("H.equals(B)?"+math.equals(matb));}
}
/*
程序运行结果如下:
A TriangleMatrix(4阶):1   2   3   40   5   6   70   0   8   90   0   0  10
B TriangleMatrix(4阶):1   0   0   10   1   0   00   0   0   00   0   0   1
C=A+B TriangleMatrix(4阶):2   2   3   50   6   6   70   0   8   90   0   0  11
A+=B TriangleMatrix(4阶):2   2   3   50   6   6   70   0   8   90   0   0  11
C.equals(A)?trueD TriangleMatrix(4阶):1   0   0   02   3   0   04   5   6   07   8   9  10
E TriangleMatrix(4阶):1   0   0   00   1   0   00   0   0   01   0   0   1
F=D+E TriangleMatrix(4阶):2   0   0   02   4   0   04   5   6   08   8   9  11
D+=E TriangleMatrix(4阶):2   0   0   02   4   0   04   5   6   08   8   9  11
F.equals(D)?true
B.equals(E)?falseB的转置矩阵G TriangleMatrix(4阶):1   0   0   00   1   0   00   0   0   01   0   0   1
G.equals(E)?trueE的转置矩阵H TriangleMatrix(4阶):1   0   0   10   1   0   00   0   0   00   0   0   1
H.equals(B)?true*/

数据结构--三角矩阵的压缩存储相关推荐

  1. 数据结构的学习_4.2 矩阵的压缩存储(对称矩阵)

    4.2 矩阵的压缩存储(一) 在有些情况下,矩阵中含有许多值相同或者值为零的元素,如果还按前面的方法来存储这种矩阵,就会产生大量的空间浪费.为了节省存储空间,可以对这类矩阵采用压缩存储. 4.2.1 ...

  2. 数据结构笔记(十七)--矩阵的压缩存储

    矩阵的压缩存储 一.矩阵的分类 1.特殊矩阵:其矩阵值在在矩阵中分布有规律 2.稀疏矩阵:矩阵的非零值在矩阵中占比小于0.05的矩阵,即零值占比在95%以上 3.一般矩阵:不属于上面的两种矩阵 二.矩 ...

  3. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  4. 三角矩阵上三角列优先压缩存储---加法、减法、乘法、转置、秩、行列式值、伴随矩阵、逆

    三角矩阵上三角列优先压缩存储: 我们以图4.9中的矩阵A矩阵为例,针对A上三角部分,采用以列为主序存储至一个一维数组B内,按照三角矩阵上三角元素构成可知,该部分有n(n+1)/2个元素,因为下三角中的 ...

  5. 数据结构C语言实现-矩阵的压缩存储

    一.矩阵的压缩存储: 在编写程序时往往都是二维数组表示矩阵,然而在数值分析中经常出现一些阶数很高的的矩阵同时在距震中有很多值相同的元素,或者是零元素,为了节省空间,可以对这类矩阵进行压缩存储,所谓的压 ...

  6. 矩阵的压缩存储(随机稀疏矩阵的建立和输出)

    实际应用中会有很多利用高阶矩阵的问题,有的高阶矩阵已达到几十万阶,几千亿个元素.然而,多数的高阶矩阵中包含了大量的数值为零的元素,需要对这类矩阵进行压缩存储.因为合理的压缩存储不仅能有效地节省存储空间 ...

  7. 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)

    在矩阵中有许多值相同的元素或者是零元素.有时为了节省存储空间,可以对这类矩阵进行压缩存储.所谓的压缩存储是指:为多个值相同的元值分配一个存储空间:对零元不分配空间. 5.32稀疏矩阵 在m*n的矩阵中 ...

  8. 9.特殊矩阵的压缩存储

    压缩存储:指多个值相同的元素只分配一个存储空间, 对零元素不分配存储空间. 特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的 分布有一定规律性的矩阵. 特殊矩阵的压缩存储:找出 ...

  9. 34-对称矩阵的压缩存储

    对于矩阵这样由n行n列构成的数据集合,可以通过二维数组来进行存储. 在实际工程中也会用到一些特殊的矩阵, 特殊矩阵可以"压缩"的一种思维来降低空间需求. (1)对角矩阵 (2)对称 ...

最新文章

  1. Science首发奥密克戎突刺蛋白分子水平分析,揭秘2大传染性增强原因,柳叶刀:全球大流行有望3月结束...
  2. 代理上网后localhost使用不了,只能使用127.0.0.1解决
  3. python基础知识选择题-python基础知识练习题(二)
  4. Leetcode 剑指 Offer 58 - II. 左旋转字符串 (每日一题 20210830)
  5. 在STM32上实现使用DMA+USART3传输数据
  6. 制作win10安装u盘_最简单的Win10系统安装U盘制作方法
  7. lm723大电流可调电源电路图_三端稳压模块LM338组成的高精度大电流可调稳压电源,电流可到达5A...
  8. FreeRTOS+STM32F103中断中发送任务通知单片机死机问题
  9. angularjs config_AngularJS依赖注入
  10. 我弟弟用管理员身份把我和爸妈的WIFI设置了,现在就他能用网,气不过,有办法让我出口气吗?
  11. excel嵌入动态二维码 含中文
  12. CAM350 - 导出 DXF 文件
  13. 谈谈你对Spring 事务的理解
  14. 全国大学建模与计算机应用竞赛,2014年全国大学生数学建模与计算机应用竞赛报名通知...
  15. syslog与syslog服务器的配置
  16. 让“猪场”名副其实的网易味央,是如何玩转“互联网+养猪”的?
  17. 路由器linux版本升级,华为路由器升级全攻略
  18. 人才招聘微信小程序开发制作功能介绍
  19. python判断是否是闰年!
  20. 数据库和HTML的使用

热门文章

  1. ABAP EWM模拟 /SCWM/ADGI过账更改HU数量
  2. 乔布斯经典语录:洗尽铅华的感悟
  3. 王者农药人物信息爬取
  4. 求和1+2+......+n
  5. c语言数论应用有关题目,中学数学中及初等数论相关的几个问题.docx
  6. ES6新语法及vue基础
  7. seo文章重复率高不利于收录
  8. 【红队APT】钓鱼篇Office-CVE漏洞RLO隐藏压缩包释放免杀打包捆绑
  9. 破坏生产力的5种方法
  10. 白银之手服务器人物不显示,白银之手 - 萌娘百科 万物皆可萌的百科全书