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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储

發布時間:2025/3/19 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(1)稀疏矩陣的特點

在一個m×n的矩陣中,設矩陣中有i個元素不為零,并令△=i/(m×n),稱△為稀疏因子。通常當△≤0.05時。認為該矩陣為稀疏矩陣。

對這類矩陣實現壓縮存儲的基本思路是只需要存儲其非零元素,但由于稀疏矩陣中零元素的分布沒有一定規律,所以必須同時記下零元素所在的行和列。才能對矩陣有效的縮壓,并能正確的恢復它。

(2)稀疏矩陣的壓縮存儲原理

只存儲非零元素ai,j和相應的行、列序號i、j。具體方法:對稀疏矩陣中每一個非零元素設定一個三元組(i,j,ai,j),將所有三元組按行優先排列,組成一個三元組表(線性表)。只要存儲三元組表和該矩陣的行、列數,就能唯一確定該矩陣。

例5.8 按稀疏矩陣的壓縮存儲方法,求矩陣A的存儲信息。

稀疏矩陣A

分析:設左上角的元素所在位置為第1行第1列,矩陣的行、列及非零元素個數為:(5,6,6)相應的三元組表為:(1,2,12)(1,3,9)(3,1,3)(3,6,14)(4,3,24)(5,2,16)。

(3)存儲方法

通過上述轉換,對稀疏矩陣的壓縮存儲,化為對其三元組表和相關信息的存儲。

用結構體類型描述三元組

typedef struct{ int i , j ;detetype e;}triple d; /* 三元組類型 */

結構體triple的成員i,j分別是非零元素的行、列下標,成員e是非零元素。 triple d 說明了triple類型的結構體變量d,并分配了存儲單元,如圖5-9(a)所示。triple data [10]說明了triple類型的有10個數組元素的結構體數組,如圖5-9(b)所示。

三元組類型的變量和數組的結構圖

用結構體類型描述三元組表和相關信息

typedef struct{ int mu, nu, tu ;triple data [ max+1] ; /*max+1是最多的元素個數*/}triplegrupe; /*三元組表類型*/triplegrupe a;

說明了三元組表類型的變量a,有4個成員項,mu﹑nu分別表示稀疏矩陣的行﹑列數,tu表示稀疏矩陣中的非零元素的個數;data表示非零元素的三元組表。

例5.9

矩陣

稀疏矩陣a的存儲結構

(4)算法舉例

例5.10 如圖5-12所示,求壓縮存儲的稀疏矩陣A的轉置矩陣AT

A與其轉置矩陣AT

分析

由A得到三元組表:

((1,1,1),(1,3,5),(1,5,2),(2,1,7),(3,1,3),(3,3,6))

把上述三元組表中的各三元組的行﹑列互換得到的AT的三元組表為:

((1,1,1),(3,1,5),(5,1,2),(1,2,7),(1,3,3),(3,3,6))

存在問題:按上述方法得到的轉置后矩陣AT的新三元組表沒有能按行序為主序存儲。

為了使新三元組表要按行序為主序存儲,就要按原表的列為主序排列。而原三元組表是按行序為主存儲的,所以同一列中的各行已按行序由小到大順序排列。

方法如下

按第1,2,3,…n列的順序,逐次掃描A相應的三元組表,依次把得到的第1,2,…,n列的三元組中的行、列互換,存入新三元組表。每次掃描中,因為相同列的三元組按掃描的先后順序存入。這保證了新三元組表以行序為主針對A的三元組表:

以第1列掃描,找到:(1,1,1),(2,1,7),(3,1,3)。

交換行和列的坐標存入新表。

以第2列掃描,未找到。

以第3列掃描,找到:(1,3,5),(3,3,6)。

交換行和列的坐標存入新表。

以第4列掃描,未找到。

以第5列掃描,找到:(1,5,2)。

交換行和列的坐標存入新表。

新表為:

(1,1,1),(1,2,7),(1,3,3),(3,1,5),(3,3,6),(5,1,2)

程序

void transpose (triplegrupe a, tripletgrupe b){ int p,q,col;b.mu=a.nu;b.nu =a.mu;b.tu =a.tu;if(b.tu){ q=1;for(col=1 ; col≤a.nu; col++)for(p=1 ; p≤a.tu; p++)if(a.data[p].j==col){ b.data[q].i=a.data[p].j;b.data[q].j= a.data[p].i;b.data[q].v=a.data[p].e;q++;}}}

其中:

a是稀疏矩陣的三元組表,b是轉置矩陣的三元組表;

p是稀疏矩陣的三元組數組下標.q是轉置矩陣的三元組數組下標;

a.mu是稀疏矩陣的行數,a.nu是稀疏矩陣的列數;

a.tu是稀疏矩陣三元組數元素的個數;

col是循環變量。

在稀疏矩陣三元組中從第1列掃描到a.nu列,若找到相應列的三元組,則把行﹑列互換存入轉置矩陣的三元組。

存儲變化示意圖

轉置前:如圖5-13(a)、圖5-13(b)、圖5-13(c)所示。

轉置后:如圖5-13(d)、圖5-13(e)、圖5-13(f)所示。

程序運行前后存儲變化示意圖(a)矩陣A;(b)矩陣A的行﹑列信息;(C)矩陣A的三元組數組

總結

以上是生活随笔為你收集整理的c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储的全部內容,希望文章能夠幫你解決所遇到的問題。

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