日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

十五、稀疏矩阵的乘法运算

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 十五、稀疏矩阵的乘法运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

十五、稀疏矩陣的乘法運算

文章目錄

  • 十五、稀疏矩陣的乘法運算
    • 題目描述
    • 解題思路
    • 上機代碼

題目描述

數據壓縮是提高傳輸、存儲效率一種技術。教材第5章介紹了兩種簡單的壓縮存儲方法。

本實驗要求實現兩個稀疏矩陣相乘積的算法**。其中稀疏矩陣非零元素數量小于100.**

輸入:

第1個稀疏矩陣的行數

  • 列數
  • 非零元個數(三個數都大于0)
  • 三元組

第2個稀疏矩陣的行數

  • 列數
  • 非零元個數(三個數都大于0)
  • 三元組

以行為主序輸入稀疏矩陣三元組表

輸出

乘積矩陣的行數
列數
非零元個數(三個數都大于0)
三元組

測試輸入期待的輸出時間限制內存限制額外進程
測試用例 13
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秒256KB0

解題思路

教材第 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; }

總結

以上是生活随笔為你收集整理的十五、稀疏矩阵的乘法运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。