学习日志---矩阵表示及特殊矩阵压缩
矩阵类:二维数组实现!!
每一行看成一个一维数组,在放入几个集合里面即可;
用到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
学习日志---矩阵表示及特殊矩阵压缩相关推荐
- 苏嵌学习日志08 07.16
学习日志 刘易中 07.16 今日学习任务 C51单片机的基本常识.LED灯.蜂鸣器.普通按键.矩阵按键 今日任务完成情况 复习了C51单片机的理论知识,介绍了LED灯.蜂鸣器.按键的简单编程和仿真 ...
- KNN算法的matlab学习日志123
KNN算法的matlab学习日志123 K邻近算法--普通的方法入门级通用 本质原理是样本集中的数据与其所属分类存在的对应关系. 首先,了解下K-近邻算法的一般流程: 1.收集数据 2.准备数据 3. ...
- FPGA学习日志——OV7670寄存器配置
FPGA学习日志 鼓励自己每天进行学习总结:2021.2.6 找到了ov7670寄存器的配置具体介绍 转载自: OV7670配置和调试总结--浩爹 SCCB协议介绍与应用和OV7670摄像头的寄存器配 ...
- Python学习日志08 - 字典
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 Python学习日志08课 - 字典 前言 进入正题 创 ...
- Python学习日志04 - 列表
Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 第04课:Python的容器型数据类型 进入今天的正题 ...
- Unity学习日志_车轮碰撞器简介
Unity学习日志_车轮碰撞器简介 1. 简介: 车轮碰撞器是一种针对地面车辆的特殊碰撞体.他有内置的碰撞检测.车轮物理系统和有滑胎摩擦的参考体.除了车轮,该碰撞体也可以用于其他游戏对象. 属性: M ...
- 学习日志框架之——搞懂logback
文章目录 系列文章目录 一.logback概述 1.Logback简介 2.Logback中的组件 3.Logback配置文件 4.日志输出格式 二.使用示例 1.依赖导入 2.入门案例 3.配置文件 ...
- 从零开始的Linux学习日志(4)
从零开始的Linux学习日志(4) 用户身份与能力 1.UID 2.GID和Groups 3.添加新用户useradd 4.添加新的用户组groupadd 5.修改用户属性usermod 6.修改用户 ...
- 从零开始的Linux学习日志
从零开始的Linux学习日志 从零开始的Linux学习生活 搭建环境 常见的Linux指令 1. echo 2.date 3.reboot和poweroff 4.其他重要指令 小结 从零开始的Linu ...
最新文章
- a++浏览器_“公司发给我的职业装太小了,我该怎么和领导说?”哈哈哈哈哈|职业装|uc|浏览器...
- 管窥MVVMLight Command参数绑定和事件传递
- 学会做“男人”—Linux Man的使用技巧
- 基于Python的开源人脸识别库,离线识别率高达99.38%
- 计算机病毒怎么做图片解说,【虎子_游戏解说】计算机病毒防范的实施方法
- jquery使用原型
- 赠书5本包邮:数据思维实践、Cloud Native分布式架构原理与实践
- greenplum 查询出来的数字加减日期_常用SQL系列之(八):列值累计、占比、平均值以及日期运算等
- “远程办公扼杀了万亿美元的办公经济”
- 特斯拉最强自动驾驶系统登场,实测视频火热出炉
- 乔安监控电脑客户端_公司上网监控使用安装电脑监控软件?
- VScode报错“终端将被任务重用,按任意键关闭
- android拉勾轮播,拉勾网顶部轮播图的实现(一)以及简单闭包的应用
- Python中list.pop()的使用
- ukey证书是什么意思_什么是证书?
- java 朋友圈功能开发_java开发的微信分享到朋友圈功能
- 我热爱计算机作文450字,热爱音乐的我作文450字
- 1.1哈恩巴纳赫定理
- 32位颜色 转换成16位颜色
- 怎么用黑白打印机打印清晰可读的PPT文档
热门文章
- MySQL的chap服务器_chap01 初涉MySQL
- python 微服务框架_Python微服务架构chili_chicken
- java 课程设计数据库_人事管理系统(java数据库课程设计)+SQL数据库
- python读取data_Python批处理数据读取方法的细节:dataloader,Pytorch,批量,详解,DataLoader...
- pcb设计单点接地示意图_4种PCB设计中的接地方式解析
- 晶体封装越小esr越大_二轮复习分子晶体与原子晶体
- ProxyPass与ProxyPassReverse及ProxyPassMatch的概述
- 什么是jQuery?
- Python案例:汉诺塔游戏
- 【BZOJ1095】捉迷藏,动态点分治