<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Q:什麼是矩陣
A:數學上,一個矩陣由 m 行 n 列的元素組成,是一個 m 行,n 列的表,m 和 n 是矩陣的維度。一般地,寫作 mxn(讀作“m乘n”)來指明一個 m 行 n 列矩陣。矩陣的元素個數總計為 mn 個。如果 m 等於 n ,矩陣為方陣。
一般情況下,矩陣的標準儲存方式是一個二維陣列 a[MAX_ROWS][MAX_COLS] 。利用這種儲存方式,可以通過 a[i][j] ,通過行下標,列下標快速找到任意元素的儲存位置。
Q:什麼是稀疏矩陣
A:一個矩陣的絕大部分都為零元素,我們把這種矩陣稱為稀疏矩陣。
如圖:矩陣中只有 2/15 是非零元素,這就是一個標準的稀疏矩陣
Q:二維陣列儲存矩陣的缺點
A:如果一個矩陣中包含很多零元素(是稀疏矩陣),就會浪費大量的儲存空間。因此,稀疏矩陣的儲存表示只需儲存非零元素。
Q:稀疏矩陣的儲存方式
A:通過對矩陣的分析,我們發現使用三元組 <row,col,value> 能夠唯一的刻畫矩陣的任意一個元素。這意味者可以使用三元陣列來儲存表示稀疏矩陣。
程式碼演示
#define MAX_TERMS 101 //定義最大長度 typedef struct{ int col; int row; int xalue; }term; term a[MAX_TERMS];
我們可以用 a[0].row 表示行的數目,用 a[0].col 表示列的數目,用 a[0].value 表示非零元素的總數。其他位置 row 域存放行下標, col 域存放列下標,value 域存放元素值。三元組按照行的順序排序,並且在同一行內按照列的順序排序。
稀疏矩陣儲存為三元組
行 | 列 | 值 | |
---|---|---|---|
a[0] | 5 | 6 | 4 |
a[1] | 0 | 0 | 15 |
a[2] | 1 | 1 | 11 |
a[3] | 2 | 3 | 6 |
a[4] | 4 | 0 | 9 |
為了轉置一個矩陣,必須交換它的行和列。也就是說,原矩陣的任意元素 a[i][j] 應該成為其轉置矩陣的元素 b[j][i]
依次迴圈每一列,找到每一列的所有元素並把他們儲存在轉置矩陣的對應的行上。
//虛擬碼
for 對於 j 列的所有元素
把元素<i,j,value>放置在元素<j,i,value>中
程式碼演示
void transpose(term a[],term b[]) //b是a的轉置 { int n,i,j,currentb; n=a[0].value; //元素總數 b[0].row=a[0].col; //b的行數=a的列數 b[0].co 1=a[0].row; //b的列數=a的行數 b[0].value =n; if(n> 0) {// 非零矩陣 currentb=1; for(i=0;i<a[0].col;i++) //按a的列轉置 for(j=1;j<=n;j++) //找出當前列的所有元素 if(a[j].col==i) {//元素是當前列的,加入b b[currentb]. row=a[j]. col; b[currentb]. col=a[j]. row; b[currentb]. value=a[j]. value; currentb++; } } }
首先確定原矩陣中每一列的元素個數,這也就是其轉置矩陣中每一行的元素個數。於是就可以得到轉置矩陣每行的起始位置,從而,可以將原矩陣的元素依次移到其轉置矩陣中的恰當位置。
程式碼演示
void fast transpose(term a[], term b[]) { //將a的轉置矩陣存放於b中 int row terms[MAX_COL], starting pos[MAX_COL]; int i,j, num_cols=a[0].col, num_terms=a[0].value; b[0].row=num_cols;b[0].col=a[0].row; b[0].value=num_terms; if(num_terms>0){//非零矩陣 for(i=0;i<num_cols;i++) row_terms[i]=0; for(i=1;i<=num_terms;i++) row_terms[a[i]. co]]++; starting_pos[0]=1; for(i=1;i<num cols;i++) starting_pos[i]=starting_pos[i-1]+row_terms[i-l]; for(i=1;i<=num_terms;i++){ j=starting_pos[a[i].col]++; b[j].row=a[i].col;b[j].col=a[i].row; b[j].value=a[i].value; } } }
Q:什麼是矩陣乘法
A:設A為 mxp 的矩陣,B為 pxn 的矩陣,那麼稱 mxn 的矩陣D為矩陣A與B的乘積,記作D=AB,其中矩陣D中的第 i 行第 j 列元素可以表示為:
注意:兩個稀疏矩陣的乘積可能不再是稀疏矩陣
我們可以按照行的順序計算D的元素,把元素存放到正確的位置,這樣就不用移動已計算出的元素的位置。一般情況下,必須遍歷整個B才能得到第 j 列的所有元素。但是,我們可以先計算 B 的轉置,使列元素順序相續排序,可以避免重複多次遍歷整個 B 。
對於找出的 A 的第 i 行和 B 的第 j 列的所有元素,做合併操作就能實現矩陣乘法。
程式碼演示
void storesum(term a[],int *totald,int row,int column,int *sum) {//如果 *sum!=0,它的行和列儲存位置為 d 中的 *totald+1 if(*sum) if(*tptald<MAX_TERMS) { d[++*totald].row=row; d[*totald].col=column; d[*totald].value=*sum; *sum=0; } else{ fprintf(stderr,"Numbers of terms in product exceeds %dn",MAX_TERMS); exit(1); } } void mmult(term a[], term b[], term d[]) //將兩個稀疏矩陣相乘 { int i,j,column,totalb=b[0].value,totald=0; int rows_a=a[0].row,cols_a=a[0].col; totala=a[0].value;int cols_b=b[0].col; int row_begin=1, row=a[1].row, sum=0; int new_b[MAX-TERMS][3]; if(cols_a!=b[0].row){ fprintf(stderr,"Incompatible matricesn"); exit(1); } fast_transpose(b.new_b); //設定邊界條件 a[totala+1].row=rows_a; new_b[totalb+1].row=cols_b; new_b[totalb+1].col=0; for(i=1;i<=totala;){ column=new_b[1].row; for(j=1;j<=totalb+1;){ //將a的行乘以b的列 if(a[i].row!=row){ storesum(d,&totald,row,column,&sum); i=row_begin; for(;new_b[j].row==column;j++) ; column=new_b[j]. row; } else if(new_b[j].row!=column){ storesum(d,&totald,row,column,&sum); i=row_begin; column=new_b[j].row; } else switch(COMPARE(a[i].col,new_b[j].col)){ case-1://轉到a中的下一項 i++;break; case 0://新增項,轉到a和b的下一項 sum+=(a[i++].value*new_b[j++].value); break; case 1://來到b的下一項 j++; } }// for j<=totalb+1 結束迴圈 for(;a[i].row==row;i++) ; row_begin=i;row=a[i].row; }//for i<=totala 結束迴圈 d[0].row=rows_a; d[0].col=cols_b;d[0].value=totald; }
到此這篇關於C++超詳細講解稀疏矩陣的文章就介紹到這了,更多相關C++稀疏矩陣內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45