行逻辑连接的顺序表实现稀疏矩阵乘法
生活随笔
收集整理的這篇文章主要介紹了
行逻辑连接的顺序表实现稀疏矩阵乘法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
行邏輯連接順序表
采用一位三元結構體組記錄的每一個元素在矩陣中的具體位置,采用一維數組記錄每行第一個非元素的位置,具有記錄行數,列數和非元素總個數的結構體成員變量。
算法思想
逐行求積,每次處理一行,設立一個一維數組ctemp對應乘積結果中的對應行元素構成的數組。
將前乘矩陣M當前行的非0元素找到對應在后乘矩陣N中的對應行,依次去乘其行中每一列的非0元素,然后累加到ctemp對應的元素的位置上。
每行運算結束進行壓縮存儲到矩陣Q中。
注意事項
本示例中將矩陣的行號和列號與所用數據結構對應,因此三元順序組和儲存行信息的數組下標為0的位置屬于浪費位置,可通過修改代碼中部分變量的值更正。
以下為可運行源碼,內含例子驗證正確性。
#include <stdio.h> const int MAXSIZE = 100;//最多非0元素個數 const int MAXRC = 100;//矩陣最多行數 typedef int ElemType; typedef struct{int i,j;ElemType e; }Triple; typedef struct{Triple data[MAXSIZE+1];//非0三元組表int rpos[MAXRC+1];//各行第一個非0元的位置表 int mu,nu,tu;//矩陣行數、列數與非0元素個數 }RLSMatrix; //行邏輯連接的矩陣M*N算法函數 int MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q){int ccol=0;//行累加器 //可運算性判斷 if(M.nu!=N.mu)return -1;//Q的初始化 Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;//Q為非0矩陣才有運算必要if(M.tu*N.tu!=0) {//當前處理的M的行標 int arow;//按行處理,arow即是前乘矩陣M的行號也是結果矩陣Q的行號 for(arow=1;arow<=M.mu;++arow) {//行元素累加器清0 int ctemp[M.nu]={0};//每計算 一行設置當前行的第一個非0元素位置為之前行所有非0 元素之和+1 Q.rpos[arow]=Q.tu+1;//當前行的下一行第一個非0元素在M.data中的位置,如果是最后一行取所有的非0元素之和+1 int tp=0;if(arow<M.mu)tp=M.rpos[arow+1];else{tp=M.tu+1;} int p=0;int q=0;int t=0; //對當前行的每一個非0元素處理 計算其對應的位置乘積和 int brow=0;for(p=M.rpos[arow];p<tp;++p) {//找到該元素對應的N的行號 brow = M.data[p].j;//取找到的N對應行下一行第一個元素的位置,如果是最后一行取所有的非0元素之和+1 if(brow<N.mu)t=N.rpos[brow+1];elset=N.tu+1;//N對應行位置上的元素與M當前位置元素相乘,累加進入ctemp行累加器對應位置 for(q=N.rpos[brow];q<t;++q){ccol=N.data[q].j;ctemp[ccol]+=M.data[p].e*N.data[q].e;} }//累加器上對應位置壓縮存儲 for(ccol=1;ccol<=Q.nu;++ccol){if(ctemp[ccol]){if(++Q.tu>MAXSIZE)return -1;Q.data[Q.tu].i=arow;Q.data[Q.tu].j=ccol;Q.data[Q.tu].e=ctemp[ccol];}}}Q.rpos[arow]=Q.tu+1;}return 1; } int main(){RLSMatrix M={{{0,0,0},{1,1,3},{1,4,5},{2,2,-1},{3,1,2}},{0,1,3,4,5},3,4,4};RLSMatrix N={{{0,0,0},{1,2,2},{2,1,1},{3,1,-2},{3,2,4}},{0,1,2,3,5},4,2,4};RLSMatrix M0={{{0,0,0},{1,1,1},{1,2,2},{1,3,3},{2,1,4},{2,2,5},{2,3,6}},{0,1,4,0},2,3,6};RLSMatrix N0={{{0,0,0},{1,1,1},{1,2,2},{2,1,3},{2,2,4},{3,1,5},{3,2,6}},{0,1,3,5,0},3,2,6};RLSMatrix Q;MultSMatrix(M0,N0,Q);for(int i=1;i<=Q.tu;i++)printf("%4d%4d%4d\n%5d\n%5d%5d%5d\n%5d\n\n",Q.data[i].i,Q.data[i].j,Q.data[i].e,Q.rpos[i],Q.mu,Q.nu,Q.tu,i);}?
?
?
?
總結
以上是生活随笔為你收集整理的行逻辑连接的顺序表实现稀疏矩阵乘法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python复利代码_使用Python进
- 下一篇: Cent OS 8安装Docker