矩阵类:二维数组实现!!

每一行看成一个一维数组,在放入几个集合里面即可;

用到random类,可以生产随机数,括号里是最大值;

矩阵类:
public class MyMatrix {int[][] matrix ;//矩阵数组Random random =new Random() ;//随机数对象//默认的构造方法,生成3*3的矩阵public MyMatrix(){//默认是3*3矩阵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++){//这里可以j<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];}}   }}
}

对称矩阵的压缩算法:

把下三角或者上三角存在一维数组中;

把二维数组中的数据三角式的一行一行的存在一维数组中,取出时,对应n*n循环,找出一维数组中的位置对应数据存在二维数组中,即为二维数组。

//对称矩阵类压缩
public class SynmeMatrix {//a用来存储矩阵的副本double [] a;//矩阵元素int n; //矩阵的阶数;int m; //一维数组的个数public SynmeMatrix(int n){//需要保持的元素个数是m=n*(n+1)/2 ;//这里要注意m的大小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]);//把b中的数据存到a这个副本中//因为是对称阵,三角式的一行一行的存里面,这样起到节省空间的作用a[k++]=b[i][j]; //只保存下三角元素}}}}//通过一个一维数组来初始化,那么这个一维数组就是对称矩阵元素的副本//b为副本,传进来,因此与a相等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++){//k是指副本中的位置,根据i和j找到对应该位置的值,两个synmeMatrix相同,因此具有的规则一样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();}}
}

稀疏矩阵压缩算法:

只存储数据的位置和元素,用三元组存储;

三元组的存储结构可以用一维数组或者链表结构;

这里用到了前面的MyVector集合存储非零数据信息;

下面是用数组的结构建立的系数矩阵;

//三元组类,非零元素的信息,行、列、数据
//每个节点都是一个数据点
public class Three {public int row;public int col;public double value;public Three(int r,int c,double v){this.row = r;this.col = c;this.value = v;}public Three(){this(0,0,0.0);}}//稀疏矩阵类
//需要行和列,以及非零元素个数和位置即可
public class SpaMatrix {int rows; //行数int cols; //列数int dNum;//非零元素个数//v是存非零元素的集合,v中的顺序不重要,因为都是相互独立的MyVector v;SpaMatrix(int max){rows = cols = dNum=0;v = new MyVector(max);}//根据用户传来的三元组数组,来初始化矩阵public void evaluate(int r,int c,int d,Three[] item)throws Exception{this.rows = r;this.cols = c;this.dNum = d;for(int i=0;i<d;i++){v.add(i, item[i]);}}//稀疏矩阵的转置public SpaMatrix transport()throws Exception{//稀疏矩阵只需要非零元素的位置和数据,因此构建时传入v的大小即可;SpaMatrix a = new SpaMatrix(v.size());a.rows = this.cols;a.cols = this.rows;a.dNum = this.dNum;for(int i=0;i<dNum;i++){Three t = (Three)v.get(i);a.v.add(i, new Three(t.col,t.row,t.value));}return a;}//打印稀疏矩阵的方法public void print() throws Exception{System.out.println("矩阵的行数:"+this.rows);System.out.println("矩阵的列数:"+this.cols);System.out.println("非零元素个数:"+this.dNum);System.out.println("矩阵三元组为:");for(int i=0;i<dNum;i++){System.out.println("a<"+((Three)v.get(i)).row+","+((Three)v.get(i)).col+">="+((Three)v.get(i)).value);  }}
}

也可用链表结构实现:

图片不清楚,文字说明:每个节点都存位置信息,数据信息和下一个节点位置,这种方法不是很好。

数组与链式结构相结合:

图片不清楚,文字说明:这种方法比较好的地方就是很清晰,数组记录行,后面的链表记录该行内列的信息,依次连接。

转载于:https://blog.51cto.com/wukong0716/1688710

学习日志---矩阵表示及特殊矩阵压缩相关推荐

  1. 苏嵌学习日志08 07.16

    学习日志 刘易中 07.16 今日学习任务 C51单片机的基本常识.LED灯.蜂鸣器.普通按键.矩阵按键 今日任务完成情况 复习了C51单片机的理论知识,介绍了LED灯.蜂鸣器.按键的简单编程和仿真 ...

  2. KNN算法的matlab学习日志123

    KNN算法的matlab学习日志123 K邻近算法--普通的方法入门级通用 本质原理是样本集中的数据与其所属分类存在的对应关系. 首先,了解下K-近邻算法的一般流程: 1.收集数据 2.准备数据 3. ...

  3. FPGA学习日志——OV7670寄存器配置

    FPGA学习日志 鼓励自己每天进行学习总结:2021.2.6 找到了ov7670寄存器的配置具体介绍 转载自: OV7670配置和调试总结--浩爹 SCCB协议介绍与应用和OV7670摄像头的寄存器配 ...

  4. Python学习日志08 - 字典

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志08课 - 字典 前言 进入正题 创 ...

  5. Python学习日志04 - 列表

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 第04课:Python的容器型数据类型 进入今天的正题 ...

  6. Unity学习日志_车轮碰撞器简介

    Unity学习日志_车轮碰撞器简介 1. 简介: 车轮碰撞器是一种针对地面车辆的特殊碰撞体.他有内置的碰撞检测.车轮物理系统和有滑胎摩擦的参考体.除了车轮,该碰撞体也可以用于其他游戏对象. 属性: M ...

  7. 学习日志框架之——搞懂logback

    文章目录 系列文章目录 一.logback概述 1.Logback简介 2.Logback中的组件 3.Logback配置文件 4.日志输出格式 二.使用示例 1.依赖导入 2.入门案例 3.配置文件 ...

  8. 从零开始的Linux学习日志(4)

    从零开始的Linux学习日志(4) 用户身份与能力 1.UID 2.GID和Groups 3.添加新用户useradd 4.添加新的用户组groupadd 5.修改用户属性usermod 6.修改用户 ...

  9. 从零开始的Linux学习日志

    从零开始的Linux学习日志 从零开始的Linux学习生活 搭建环境 常见的Linux指令 1. echo 2.date 3.reboot和poweroff 4.其他重要指令 小结 从零开始的Linu ...

最新文章

  1. a++浏览器_“公司发给我的职业装太小了,我该怎么和领导说?”哈哈哈哈哈|职业装|uc|浏览器...
  2. 管窥MVVMLight Command参数绑定和事件传递
  3. 学会做“男人”—Linux Man的使用技巧
  4. 基于Python的开源人脸识别库,离线识别率高达99.38%
  5. 计算机病毒怎么做图片解说,【虎子_游戏解说】计算机病毒防范的实施方法
  6. jquery使用原型
  7. 赠书5本包邮:数据思维实践、Cloud Native分布式架构原理与实践
  8. greenplum 查询出来的数字加减日期_常用SQL系列之(八):列值累计、占比、平均值以及日期运算等
  9. “远程办公扼杀了万亿美元的办公经济”
  10. 特斯拉最强自动驾驶系统登场,实测视频火热出炉
  11. 乔安监控电脑客户端_公司上网监控使用安装电脑监控软件?
  12. VScode报错“终端将被任务重用,按任意键关闭
  13. android拉勾轮播,拉勾网顶部轮播图的实现(一)以及简单闭包的应用
  14. Python中list.pop()的使用
  15. ukey证书是什么意思_什么是证书?
  16. java 朋友圈功能开发_java开发的微信分享到朋友圈功能
  17. 我热爱计算机作文450字,热爱音乐的我作文450字
  18. 1.1哈恩巴纳赫定理
  19. 32位颜色 转换成16位颜色
  20. 怎么用黑白打印机打印清晰可读的PPT文档

热门文章

  1. MySQL的chap服务器_chap01 初涉MySQL
  2. python 微服务框架_Python微服务架构chili_chicken
  3. java 课程设计数据库_人事管理系统(java数据库课程设计)+SQL数据库
  4. python读取data_Python批处理数据读取方法的细节:dataloader,Pytorch,批量,详解,DataLoader...
  5. pcb设计单点接地示意图_4种PCB设计中的接地方式解析
  6. 晶体封装越小esr越大_二轮复习分子晶体与原子晶体
  7. ProxyPass与ProxyPassReverse及ProxyPassMatch的概述
  8. 什么是jQuery?
  9. Python案例:汉诺塔游戏
  10. 【BZOJ1095】捉迷藏,动态点分治