十五、稀疏矩阵的乘法运算
生活随笔
收集整理的這篇文章主要介紹了
十五、稀疏矩阵的乘法运算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
十五、稀疏矩陣的乘法運算
文章目錄
- 十五、稀疏矩陣的乘法運算
- 題目描述
- 解題思路
- 上機代碼
題目描述
數據壓縮是提高傳輸、存儲效率一種技術。教材第5章介紹了兩種簡單的壓縮存儲方法。
本實驗要求實現兩個稀疏矩陣相乘積的算法**。其中稀疏矩陣非零元素數量小于100.**
輸入:
第1個稀疏矩陣的行數
- 列數
- 非零元個數(三個數都大于0)
- 三元組
第2個稀疏矩陣的行數
- 列數
- 非零元個數(三個數都大于0)
- 三元組
以行為主序輸入稀疏矩陣三元組表
輸出:
乘積矩陣的行數
列數
非零元個數(三個數都大于0)
三元組
| 測試用例 1 | 3 4 4 1 1 3 1 4 5 2 2 -1 3 1 2 4 2 4 1 2 2 2 1 1 3 1 -2 3 2 4 | 3 2 3 1,2,6 2,1,-1 3,2,4 | 1秒 | 256KB | 0 |
解題思路
教材第 100 頁指出,為了便于隨機存取任意一行的非零元,需要知道每一行的第一個非零元在三元組表中的位置。因此,把指示 “行” 信息的輔助數組 cpot 固定在稀疏矩陣的存儲結構中,稱這種 “帶行鏈接信息” 的三元組表為行邏輯鏈接的順序表。
/* 行邏輯鏈接順序表 */ typedef struct {Triple data[1000]; //非零元三元組表int rpos[1000]; //各行第一個非零元的位置表int mu, nu, tu; //矩陣的行數、列數和非零元個數 }RLSMatrix;教材第 102 頁給出了稀疏矩陣乘法的基本操作描述和算法流程實現。
上機代碼
#include<cstdio> #include<stack> #include<cstring> #include<cstdlib> #include<iostream> using namespace std;//定義三元組和順序表 typedef struct {int i, j;int e; }Triple; typedef struct {Triple data[1000];int rpos[1000];int mu, nu, tu; }RLSMatrix; int rpos[1000]; int num[1000];int main() {int arow = 0, brow = 0, tp = 0;int col = 0, ccol = 0;int p = 0, t = 0, q = 0;RLSMatrix M, N, Q;//輸入M、N矩陣數據scanf("%d%d%d", &M.mu, &M.nu, &M.tu);for (int i = 1; i <= M.tu; i++)scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);scanf("%d%d%d", &N.mu, &N.nu, &N.tu);for (int i = 1; i <= N.tu; i++)scanf("%d%d%d", &N.data[i].i, &N.data[i].j, &N.data[i].e);for (col = 1; col <= M.mu; col++)num[col] = 0;for (int i = 1; i <= M.tu; i++)num[M.data[i].i]++;M.rpos[1] = 1;for (col = 2; col <= M.mu; col++)M.rpos[col] = M.rpos[col - 1] + num[col - 1];for (col = 1; col <= N.mu; col++)num[col] = 0;for (int i = 1; i <= N.tu; i++)num[N.data[i].i]++;N.rpos[1] = 1;for (col = 2; col <= N.mu; col++)N.rpos[col] = N.rpos[col - 1] + num[col - 1];/* 計算矩陣乘積 */Q.mu = M.mu;Q.nu = N.nu;Q.tu = 0;if (M.tu*N.tu != 0) {for (arow = 1; arow <= M.mu; arow++) {memset(rpos, 0, sizeof(rpos));Q.rpos[arow] = Q.tu + 1;if (arow < M.mu)tp = M.rpos[arow + 1];elsetp = M.tu + 1;for (p = M.rpos[arow]; p < tp; p++) {brow = M.data[p].j;if (brow < N.mu)t = N.rpos[brow + 1];elset = N.tu + 1;for (q = N.rpos[brow]; q < t; q++) {ccol = N.data[q].j;rpos[ccol] += M.data[p].e*N.data[q].e;}}for (ccol = 1; ccol <= Q.nu; ccol++){if (rpos[ccol]) {Q.tu++;Q.data[Q.tu].i = arow;Q.data[Q.tu].j = ccol;Q.data[Q.tu].e = rpos[ccol];}}}}//輸出乘積矩陣Qprintf("%d\n", Q.mu);printf("%d\n", Q.nu);printf("%d\n", Q.tu);for (int i = 1; i <= Q.tu; i++)printf("%d,%d,%d\n", Q.data[i].i, Q.data[i].j, Q.data[i].e);return 0; }總結
以上是生活随笔為你收集整理的十五、稀疏矩阵的乘法运算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十四、矩阵的快速转置算法
- 下一篇: 十六、广义表的建立与基本操作