稀疏矩阵的存储和乘法操作

您所在的位置:网站首页 三元组表的行表怎么画 稀疏矩阵的存储和乘法操作

稀疏矩阵的存储和乘法操作

2023-12-10 19:40| 来源: 网络整理| 查看: 265

一 稀疏矩阵的存储

1.三元组顺序表

三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,aij)唯一确定。矩阵中所有非零元素存放在由三元组组成的顺序表中(通常用数组)。所以三元组的逻辑结构如下:

//————稀疏矩阵的三元组表示法————// #define MAX_SIZE 1500 //表示稀疏矩阵的非零元素的最大个数 class Triple { int i,j;//表示非零元素的行下表和列下标 int val;//非零元素的值,此处以int类型为例 }; class TSMatrix { Triple data[MAX_SIZE]; int row_num,col_num,cnt;//稀疏矩阵的行数、列数以及非零元素的个数 };

注意,此处的非零元素的三元组是以行序为主序顺序排列的。

2.行逻辑链接顺序表

行逻辑链接顺序表的实质就是在三元组顺序表的基础上加了一个数组,这个数组用于存储稀疏矩阵中每行的第一个非零元素的在三元组顺序表中的位置(此处一定要理解对,是在三元组顺序表中的位置)。所以其逻辑结构如下:

 

//————稀疏矩阵的行逻辑链接表示法————// #define MAX_SIZE 1500 //表示稀疏矩阵的非零元素的最大个数 #define MAX_ROW 1500 //表示稀疏矩阵的行数的最大个数 class Triple { int i,j;//表示非零元素的行下表和列下标 int val;//非零元素的值,此处以int类型为例 }; class RLSMatrix { Triple data[MAX_SIZE]; //非零元三元组表 int rpos[MAX_ROW];//每行第一个非零元素的位置 int row_num,col_num,cnt;//稀疏矩阵的行数、列数以及非零元素的个数 };

 3.十字链表

当稀疏矩阵的非零元个数和位置在操作过程中变化较大时,就不易采用顺序存储结构来表示三元组的线性表。对于这种类型得矩阵,采用链式存储结构表示三元组的线性表更为恰当。

在链表中,每个非零元可用一个含5个域的结点表示,其中$i$、$j$、$val$这三个域分别表示该非零元所在的行、列和非零元的值(就是三元组中的那三个域),向右域right用以链接同一行中下一个非零元,向下域down用以链接同一行中的下一个非零元。

所以,同一行的非零元通过right域链接成一个线性链表,同一列的非零元通过down域链接成一个线性表,每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,所以才称为十字链表。十字链表中,可以使用两个分别存储行链表的头指针和列链表的头指针的一维数组表示。所以,其逻辑结构如下:

//————稀疏矩阵的十字链表表示法————// class CrossNode { int i,j;//表示非零元素的行下表和列下标 int val;//非零元素的值,此处以int类型为例 CrossNode *right,*down; //非零元所在行表和列表的后继指针域 }; class CrossList { CrossNode *row_head,*col_head; //行链表和列链表的头指针 int row_num,col_num,cnt;//稀疏矩阵的行数、列数以及非零元素的个数 };

二 稀疏矩阵的乘法 

1.一般矩阵的乘法操作 

对于一般矩阵而言,通常用二维数组表示矩阵。对于矩阵$M∈R^{m \times n}$和矩阵$N∈R^{n \times p}$而言,它们的乘法操作表示如下:

 

#include #include #include #include #include #include #include #include #include #include using namespace std; #define MAX_NUM 2 void MatrixMultiply(int M[][MAX_NUM],int N[][MAX_NUM],int rs[][MAX_NUM],int m,int n,int p) { for(int i = 0; i < m; i++) { for(int j = 0; j < p; j++) { rs[i][j] = 0;//初始化第行第j列的元素 for(int k = 0;k < n;k++) { rs[i][j] += (M[i][k] * N[k][j]);//第i行与第j列相乘求和 } } } } int main() { int M[][2] = {{1,1},{2,3}}; int N[][2] = {{2,2},{4,5}}; int rs[][2] ={{0,0},{0,0}}; MatrixMultiply(M,N,rs,2,2,2); for(int i = 0 ;i < 2;i++) { for(int j = 0 ; j < 2; j++) cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3