稀疏矩阵的转置运算

  (1)设m*n 矩阵中有t 个非零元素且t远小于m*n,这样的矩阵称为稀疏矩阵。很多科学管理及工程计算中,常会遇到阶数很高的大型稀疏矩阵。如果按常规分配方法,顺序分配在计算机内,那将是相当浪费内存的。为此提出另外一种存储方法,仅仅存放非零元素。但对于这类矩阵,通常零元素分布没有规律,为了能找到相应的元素,所以仅存储非零元素的值是不够的,还要记下它所在的行和列。于是采取如下方法:将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。

  将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,称为三元组表,采用顺序存储方法存储该表。如下图:

可以将其改写成如下的三元组的形式,同时存储器行、列和值,如下:


i


j


v


1


2


12


1


3


9


3


1


-3


3


6


14


4


3


24


5


2


18


6


1


15


6


4


-7

对应的三元组的数据结构可以写成如下形式的数据结构:

//定义三元组的数据结构类型
typedef struct{
	int i,j;		//非零元素的行和列
	ElemType e;		//非零元素的值
}Triple;

//三元组表的存储类型
typedef struct{
	int mu,nu,tu;				//矩阵的行、列以及非零元的个数
	Triple data[MAXSIZE+1];	    //三元组表
}Matrix;

(2)、矩阵的转置

要做到转置要做到三点

①、将矩阵的行列值互换

②、将每个三元组的i、j互换

③、重新排列三元组

如下图:

  

方法一:

  ①、将矩阵A的行列转化为矩阵B的列和行

  ②、一次遍历三元组的每一列的值

  

时间: 2024-10-21 02:54:15

稀疏矩阵的转置运算的相关文章

2016/1/10 作业 1, 二维数组遍历输出求和 2,转置运算???? 3,九宫格?? 后两个存在问题

1 public class arr1 { 2 3 4 public static void main(String[] args) { 5 // 创建二维数组arr[][],输出二维数组所有元素的和. 6 7 int arr[][]={{1,3,5,7,9},{21,23,25,27,29}, 8 {12,14,16,18},{32,34,36,38}}; 9 int sum=0; 10 System.out.println("二维数组遍历"); 11 // for循环 遍历 求和

三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》

#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 225 #define N 9 typedef struct{ int i,j; int e; }Triple; typedef struct{ Triple data[MAXSIZE+1]; int mu,nu,tu; }TSMatrix; int CreatSMatrix(T

数据结构:稀疏矩阵的简单运算

最近专业课比较多,没怎么看数据结构了.今天有点时间写了一下数据结构中稀疏矩阵的运算.写过之后感觉代码的构思不太好.这里先发一下, 假期的时候再重新实现一下. SpMatrix头文件 1 //The sparse matrix's header file 2 //the class SpMatrix 3 //Author: 'Karllen' 4 //Date:05/28/2014 5 6 #ifndef _SpMatrix_H_ 7 #define _SPMatrix_H_ 8 #include

稀疏矩阵的转置

稀疏矩阵:M*N的矩阵,矩阵中的有效值的个数远小于无效值的个数,而且这些数分布没有规律. 压缩存储的值极少,采用三元组(value,row,col)存储每一个有效值.三元组按照在原矩阵的位置,按照行优先存储. 构造函数: SparseMatrix(T* a,size_t m,size_t n,const T& invalid) :_rowsize(m) ,_colsize(n) ,_invalid(invalid) { for(size_t i=0;i<m;i++) { for(size_t

对矩阵进行转置运算

package lianxi; public class juzhen { public static void main(String[] args) { // TODO 自动生成的方法存根 int arr[][]=new int[][]{{1,2,3},{4,5,6},{7,8,9}}; //创建二维数组 System.out.println("转置前的的矩阵是:"); printArray(arr); //输出二维数组 int arr2[][]=new int[arr.lengt

4.7矩阵的转置运算

#include<iostream> #include<cstdio> using namespace std; void InputMatrix(int (*a)[4],int n,int m) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) printf("%d",*(a+i)+j); } void OutputMatrix(int (*b)[4],int n,int m) { for(int i=0;i&

稀疏矩阵的普通转置与快速转置算法

稀疏矩阵的普通转置与快速转置算法 一般来说,对于系数矩阵,我们使用三元组来存储.即就是将矩阵的所有非零元素的三元组存放在一个顺序表中,如图所示: 注意一个转置的前提:该顺序表是排好序的,即行优先,列其次. 一.普通转置 这种算法比较简单,也很容易想到: 算法思想: 对M.data从头至尾扫描: ?第一次扫描时,将M.data中列号为1的三元组赋值到T.data中 ?第二次扫描时,将M.data中列号为2的三元组赋值到T.data中 ?依此类推,直至将M.data所有三元组赋值到T.data中 代

稀疏矩阵转置

矩阵是线性代数中的一个知识,刚开始学习的时候可能感觉不到它有什么用处,最初的感觉就是对二维数据的操作.其实现实生活中矩阵的用处太大了,设计领域相当的广泛.在此只讨论稀疏矩阵的转置问题: 可能看到矩阵就会想到二维数组,比如这样一个矩阵: 你可能会想到用二维数组来存放此矩阵中的元素,就像这样:int text[][5] = {{0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}}; 这样好像也没有什么不好.我们再来看看这个矩阵,五行五

稀疏矩阵的压缩存储和转置

1.稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律. 2.稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据. 由于非零元素分布没有任何规律,所以在进行压缩存储的时侯需要存储无效值的同时还要存储有效元素在矩阵中的位置,即有效元素所在的行号和列号,也就是在存储某个元素比如aij的值的同时,还需要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组(i,j,aij)的线性表. 使用{ row, col, value }三元组存储每一个有效数据,三元组按原