matlab稀疏矩阵三元法,数据结构——稀疏矩阵三元组表示法+算法详解
(1)、目的:对于在实际问题中出现的大型的稀疏矩阵,若用常规分配方法在计算机中储存,将会产生大量的内存浪费,而且在访问和操作的时候也会造成大量时间上的浪费,为了解决这一问题,从而善生了多种解决方案。
(2)、由于其自身的稀疏特性,通过压缩可以大大节省稀疏矩阵的内存代价。具体操作是:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。
具体如下图:
#define SMAX 1000typedefstruct{int i,j; //储存非零元素的行和列信息
ElementType e; //非零元素的值
} Triple; //定义三元组类型
typedef struct{int mu,nu,tu; //矩阵的行、列和非零元素的个数
Triple data[SMAX]; //三元组表
} TSMatrix;
注意:为更可靠描述,通常再加一个“总体”信息:即总行数、总列数、非零元素总个数。
用常规的二维数组表示时的算法:
for (col=1; col<=nu; ++col)
{for (row=1; row<=mu; ++row)
{
T[col][row]=M[row][col];
}
}
其时间复杂度为: O(mu×nu)
用三元组表示如何实现呢?
解决思路:只要做到
将矩阵行、列维数互换
将每个三元组中的i和j相互调换
重排三元组次序,使mb中元素以N的行(M的列) 为主序
方法一:按列序转置
即按mb中三元组次序依次在ma中找到相应的三元组进行转置。为找到M中每一列所有非零元素,需对其三元组表ma从第一行起扫描一遍。由于ma中以M行序为主序,所以由此得到的恰是mb中应有的顺序。
void TransposeTSMatrix(TSMatrix A, TSMatrix *B)
{/*求矩阵A的转置矩阵B,矩阵用三元组表表示*/
intp,q, k ;
B->mu=A.nu ;
B->nu=A.mu ;
B->tu=A.tu ;if(B->tu)///整个矩阵非零元素的个数不为0
{
q=1;for(k=1; k<=A.nu; k++)///遍历A矩阵的列数
{for(p=1; p<=A.tu; p++)///遍历矩阵A的三元组
{if(A.data[p].j==k)///矩阵的列与三元组的列对应
{
B->data[q].i=A.data[p].j;
B->data[q].j=A.data[p].i;
B->data[q].e=A.data[p].e;
q++;
}
}
}
}
}
时间复杂度:O(nu*tu)
方法二:快速转置
即按ma中三元组次序转置,转置结果放入b中恰当位置
此法关键是要预先确定M中每一列第一个非零元在mb中位置,
为确定这些位置,转置前应先求得M的每一列中非零元个数
实现:设两个数组
num[col]:表示矩阵M中第col列中非零元个数
cpot[col]:指示M中第col列第一个非零元在mb中位置
其中:
cpot[1]=1;
cpot[col]=cpot[col-1]+num[col-1]; (2<=col <=ma[0].j)
FastTransposeTSMatrix (TSMatrix A, TSMatrix *B)
{/*基于矩阵的三元组表示,采用快速转置法,求矩阵A的转置矩阵B*/
intcol,t,p,q;int num[MAXSIZE+1];///A每一列中非零元素的个数
int cpot[MAXSIZE+1];///A每一列中第一个非零元素在B中的位置
B->tu=A.tu ;
B->nu=A.mu ;
B->mu=A.nu ;if(B->tu)
{for(col=1; col<=A.nu; col++)///初始化
{
num[col]=0;
}for(t=1; t<=A.tu; t++)
{
num[A.data[t].j]++; /*计算每一列的非零元素的个数*/}
cpot[1]=1;for(col=2; col<=A.nu; col++)
{/*求col列中第一个非零元素在B->data[ ]中的正确位置*/cpot[col]= cpot[col-1]+num[col-1];
}for(p=1; p<=A.tu; p++)///遍历三元组A
{
col=A.data[p].j;///col记录当前所处的列
q=cpot[col];///q代表每一列第一个非零元素
B->data[q].i=A.data[p].j;
B->data[q].j=A.data[p].i;
B->data[q].e=A.data[p].e;
cpot[col]++;///将A中每一列的第一个元素定位确定后,若这一列之后还有的元素那位置必然在第一个元素对应三元组位置的后面
}
}
}
matlab稀疏矩阵三元法,数据结构——稀疏矩阵三元组表示法+算法详解相关推荐
- C++数据结构——旅游规划(Floyd算法详解)
旅游规划 作者 陈越 单位 浙江大学 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有 ...
- 数据结构与算法详解目录
数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章 基 ...
- 【Matlab】Matlab导入多个.mat文件并画图的过程详解
Matlab导入多个.mat文件并画图的过程详解 0. 实验背景 1. 导入.mat文件存储 1.1 导入.mat文件及作图最简单的方式: 1.2 导入.mat文件及作图的脚本代码 2. plot画图 ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
- 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码
粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...
- 二叉树遍历算法详解(递归法+非递归法)
二叉树遍历算法详解 在上一篇C语言实现二叉树中有提到对于二叉树的遍历,包括前序,中序和后续遍历,以及层次遍历 大家已经熟悉了二叉树的前中后序遍历过程,大部分都采用了递归的思想来实现 在leetcode ...
- 人民币 matlab,Matlab实现人民币币值的显示 实现代码及教程详解
上图像和程序了--记得程序好像是很久以前收藏的了--分享出来了-- clear all;clc; Img = imread('I.jpg'); if ndims(Img)==3 I=rgb2gray( ...
- matlab三次样条曲线的绘制(spline和csape函数详解)
matlab三次样条函数的绘制(spline和csape函数详解) 前言 1.spline函数详解 1.一维非节点边界 2.第二边界条件 3.高维无约束 4.高维第二边界 5.利用第二边界条件绘制圆 ...
- 【数据结构Note4】-串、数组和广义表(kmp算法详解)
文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...
- 数据结构和算法详解(三)——递归、排序、散列表
一.递归 一.什么是递归? 1.递归是一种非常高效.简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索.前中后序二叉树遍历等都是使用递归. 2.方法或函数调用自身的方式称为递归调用,调用称 ...
最新文章
- 【python初识】数据和对象
- java.util.concurrent.FutureTask 源码
- Atom 相关配置备份
- uboot源码——mmc驱动分析
- Eclipse添加SVN插件:导入项目+上传项目+更新项目
- java byte缓存_java-如何使用带byte []键的番石榴缓存?
- Hexo博文加密思路总结
- dialog能提交数据吗_硬盘坏了能恢复数据吗?实用硬盘修复软件
- crc java_求这个CRC16算法的java版实现!!!
- [python]-asyncio异步通信之websockets
- python期货程序化开发_使用文华财经进行期货程序化真的很low,自己编程才是正途...
- cesium粒子特效
- uac管理员程序_有启用UAC的管理员快速打开程序的方法吗?
- 2021全球程序员收入报告出炉
- 如何压缩jpg图片大小
- word打开html显示空白,word的页面显示不正常显示不出来怎么办 word怎么恢复正常页面...
- [O2JAM劲乐团] 音乐集...
- 毕业设计 stm32酒驾检测系统 - 单片机 嵌入式 物联网
- 计算机网络——VRRP(第一条冗余协议)
- Oracle存储过程学习笔记