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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

稀疏矩阵算法

發(fā)布時間:2025/4/5 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 稀疏矩阵算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、稀疏矩陣的壓縮存儲
???  為了節(jié)省存儲單元,可只存儲非零元素。由于非零元素的分布一般是沒有規(guī)律的,因此在存儲非零元素的同時,還必須存儲非零元素所在的行號、列號,才能迅速確定一個非零元素是矩陣中的哪一個元素。稀疏矩陣的壓縮存儲會失去隨機存取功能。
???  其中每一個非零元素所在的行號、列號和值組成一個三元組(i,j,aij),并由此三元組惟一確定。
???  稀疏矩陣進行壓縮存儲通常有兩類方法:順序存儲和鏈式存儲。鏈式存儲方法。

2、三元組表
???  將表示稀疏矩陣的非零元素的三元組按行優(yōu)先(或列優(yōu)先)的順序排列(跳過零元素),并依次存放在向量中,這種稀疏矩陣的順序存儲結構稱為三元組表。
? 注意:
 ???
以下的討論中,均假定三元組是按行優(yōu)先順序排列的。
      
(1)三元組表的類型說明
 ??? 為了運算方便,將矩陣的總行數(shù)、總列數(shù)及非零元素的總數(shù)均作為三元組表的屬性進行描述。其類型描述為:
? #define MaxSize 10000 //由用戶定義
? typedef int DataType; //由用戶定義
? typedef struct { //三元組
??? int i,j;//非零元的行、列號
??? DataType v; //非零元的值
?? }TriTupleNode;

? typedef struct{ //三元組表
??? TriTupleNode data[MaxSize]; //三元組表空間
??? int m,n,t; //矩陣的行數(shù)、列數(shù)及非零元個數(shù)
? }TriTupleTable;?
????
(2) 壓縮存儲結構上矩陣的轉置運算
??? 一個m×n的矩陣A,它的轉置矩陣B是一個n×m的矩陣,且:
???????? A[i][j]=B[j][i],0≤i<m,0≤j<n,
??? 即A的行是B的列,A的列是B的行。

①三元組表表示的矩陣轉置的思想方法
  第一步:根據(jù)A矩陣的行數(shù)、列數(shù)和非零元總數(shù)確定B矩陣的列數(shù)、行數(shù)和非零元總數(shù)。
  第二步:當三元組表非空(A矩陣的非零元不為0)時,根據(jù)A矩陣三元組表的結點空間data(以下簡稱為三元組表),將A的三元組表a->data置換為B的三元組表b->data。

②三元組表的轉置
???  方法一:簡單地交換a->data中i和j中的內(nèi)容,得到按列優(yōu)先順序存儲倒b->data;再將b->data重排成按行優(yōu)先順序的三元組表。
???  方法二:由于A的列是B的行,因此,按a->data的列序轉置,所得到的轉置矩陣B的三元組表b->data必定是按行優(yōu)先存放的。
???  按這種方法設計的算法,其基本思想是:對A中的每一列col(0≤col≤a->n-1),通過從頭至尾掃描三元組表a->data,找出所有列號等于col的那些三元組,將它們的行號和列號互換后依次放人b->data中,即可得到B的按行優(yōu)先的壓縮存貯表示。

下面是完整的稀疏矩陣算法,包括加法,轉置,乘法等

#include <stdio.h>
#include <stdlib.h>
#define A 6
#define B 7
#define A1 3
#define B1 4
#define A2 4
#define B2 2
#define OK 1
#define ERROR -1;
#define MAXSIZE 1000

typedef int Status;
typedef int ElemType;
typedef struct {
? int i,j;
? ElemType e;
}Triple;???????
typedef struct {
? Triple data[MAXSIZE+1];
? int rpos[MAXSIZE+1];
? int mu,nu,tu;
}TSMatrix;???????

void CreatTripleTable (int array_a[A][B],TSMatrix *a)
/*array_aê?ò?????êè???ó,aê?2úéúμ??à??ó|μ?èy?a×é′?′¢*/
{????????????????????????????????????????????????????
? int i,j,k=1;
? //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));
? for (i=0;i<A;i++) /*°′DDó??è?3Dòé¨?èarray_aμ??a??,2??a0??′?è?B?D*/
??? for (j=0;j<B;j++)
????? if (array_a[i][j]!=0)
????? {??????
??????? a->data[k].i=i+1;
??????? a->data[k].j=j+1;
??????? a->data[k].e = array_a[i][j];
??????? //printf("i=%d\n",a->data[k].i);
??????? //printf("j=%d\n",a->data[k].j);
??????? //printf("e=%d\n",a->data[k].e);
??????? //printf("k=%d\n",k);
??????? //printf("\n");
??????? k++;
????? }
? a->mu=A;
? a->nu=B;
?// data[0][1]=N;
? a->tu=k-1;/*′?è?·?0?a????êy*/
}/*CreatTripleTable*/

void CreatTripleTable1 (int array_a[A1][B1],TSMatrix *a)
/*array_aê?ò?????êè???ó,aê?2úéúμ??à??ó|μ?èy?a×é′?′¢*/
{????????????????????????????????????????????????????
? int i,j,k=1;
? //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));
? for (i=0;i<A1;i++) /*°′DDó??è?3Dòé¨?èarray_aμ??a??,2??a0??′?è?B?D*/
??? for (j=0;j<B1;j++)
????? if (array_a[i][j]!=0)
????? {??????
??????? a->data[k].i=i+1;
??????? a->data[k].j=j+1;
??????? a->data[k].e = array_a[i][j];
??????? k++;
????? }
? a->mu=A1;
? a->nu=B1;
? a->tu=k-1;/*′?è?·?0?a????êy*/
}

void CreatTripleTable2 (int array_a[A2][B2],TSMatrix *a)
/*array_aê?ò?????êè???ó,aê?2úéúμ??à??ó|μ?èy?a×é′?′¢*/
{????????????????????????????????????????????????????
? int i,j,k=1;
? //a->data=(Triple *)malloc((MAXSIZE+1)*sizeof(Triple));
? for (i=0;i<A2;i++) /*°′DDó??è?3Dòé¨?èarray_aμ??a??,2??a0??′?è?B?D*/
??? for (j=0;j<B2;j++)
????? if (array_a[i][j]!=0)
????? {??????
??????? a->data[k].i=i+1;
??????? a->data[k].j=j+1;
??????? a->data[k].e = array_a[i][j];
??????? k++;
????? }
? a->mu=A2;
? a->nu=B2;
? a->tu=k-1;/*′?è?·?0?a????êy*/
}

Status TransposeSMatrix(TSMatrix *M,TSMatrix *T)
{
? int p,q,col;?????
? T->mu=M->nu;? T->nu=M->mu;? T->tu=M->tu;
? if (T->tu) {
??? q=1;
??? for (col=1;col<=M->nu;++col)
????? for (p=1;p<=M->tu;++p)
??????? if (M->data[p].j==col) {
????????? T->data[q].i=M->data[p].j;??? T->data[q].j=M->data[p].i;?
????????? T->data[q].e=M->data[p].e;??? ++q;
??????? }???
? }?????????
? return OK;
}

Status FastTransposeSMatrix(TSMatrix *M,TSMatrix *T)
{
? int t,p,q,col,num[A],cpot[M->nu];?????
? T->mu=M->mu;? T->nu=M->mu;? T->tu=M->tu;
? if (T->tu) {
??? for (col=1;col<=M->nu;++col) num[col]=0;
??? for (t=1;t<=M->tu;++t) ++num[M->data[t].j];
??? cpot[1]=1;
??? for (col=2;col<=M->nu;++col) cpot[col]=cpot[col-1]+num[col-1];
??? for (p=1;p<=M->tu;++p) {
????? col=M->data[p].j;?? q=cpot[col];
????? T->data[q].i=M->data[p].j;??? T->data[q].j=M->data[p].i;?
????? T->data[q].e=M->data[p].e;??? ++cpot[col];
??? }???
? }???????????????
? return OK;
}??

Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *C)//èy?a×é±íê?μ???êè???ó?ó·¨
{
? int i,j,x,ce,pa,pb,pc;??
? if (M.mu!=N.mu || M.nu!=N.nu) return ERROR;
? C->mu=M.mu;C->nu=M.nu;C->tu=0;
? pa=1;pb=1;pc=1;
? for(x=1;x<=M.mu;x++) //?????óμ???ò?DD??DD?ó·¨
? {
??? while(M.data[pa].i<x) pa++;
??? while(M.data[pb].i<x) pb++;
??? while(M.data[pa].i==x&&N.data[pb].i==x)//DDáD?μ???àμèμ??a??
??? {
????? if(M.data[pa].j==N.data[pb].j)
????? {
??????? ce=M.data[pa].e+N.data[pb].e;
??????? if(ce) //oí2??a0
??????? {
????????? C->data[pc].i=x;
????????? C->data[pc].j=M.data[pa].j;
????????? C->data[pc].e=ce;
????????? pa++;pb++;pc++;
??????? }
????? }//if
????? else if(M.data[pa].j>N.data[pb].j)
????? {
??????? C->data[pc].i=x;
??????? C->data[pc].j=N.data[pb].j;
??????? C->data[pc].e=N.data[pb].e;
??????? pb++;pc++;
????? }
????? else
????? {
??????? C->data[pc].i=x;
??????? C->data[pc].j=M.data[pa].j;
??????? C->data[pc].e=M.data[pa].e;
??????? pa++;pc++;
????? }
??? }//while
??? while(M.data[pa].i==x) //2?è?A?Dê£óàμ??a??(μúxDD)
??? {
????? C->data[pc].i=x;
????? C->data[pc].j=M.data[pa].j;
????? C->data[pc].e=M.data[pa].e;
????? pa++;pc++;
??? }
??? while(N.data[pb].i==x) //2?è?B?Dê£óàμ??a??(μúxDD)
??? {
????? C->data[pc].i=x;
????? C->data[pc].j=N.data[pb].j;
????? C->data[pc].e=N.data[pb].e;
????? pb++;pc++;
??? }
? }//for
? C->tu=pc;
? return OK;
}//TSMatrix_Add??

void PrintSMatrix(TSMatrix M)
{
? int i,j,pa;?
? int a[M.mu][M.nu];
? pa=1;
? for (i=0;i<M.mu;i++)??
??? for (j=0;j<M.nu;j++)
????? a[i][j]=0;
? for (pa=1;pa<=M.tu;pa++) {???
??? //printf("%d\n",M.data[pa].i);
??? //printf("%d\n",M.data[pa].j);
??? //printf("%d\n",M.data[pa].e);
??? a[M.data[pa].i-1][M.data[pa].j-1]=M.data[pa].e;
? }?
? for (i=0;i<M.mu;i++) {??
??? for (j=0;j<M.nu;j++)
????? printf("%6d",a[i][j]);????????????
????? printf("\n");
? }?
? printf("\n");
}???

void GetRpos(TSMatrix *M) {
? int row,t,j,num[M->mu],cpot[M->nu];
? for (row=1;row<=M->mu;++row) num[row]=0;?
? for (t=1;t<=M->tu;++t) ++num[M->data[t].i];
? M->rpos[1]=1;
? for (row=2;row<=M->mu;++row) M->rpos[row]=M->rpos[row-1]+num[row-1];
? for (t=1;t<=M->mu;++t) printf("%d\n",M->rpos[t]);
}????????????????

Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) {
? int arrow,brow,tp,p,q,t,ccol,ctemp[Q->nu];????
? if (M.nu!=N.mu) return ERROR;
? Q->mu=M.mu;? Q->nu=N.nu;? Q->tu=0;
? if (M.tu*N.tu!=0) {???
??? for (arrow=1;arrow<=M.mu;++arrow) {
????? for (p=1;p<=N.nu;p++) ctemp[p]=0;?
????? Q->rpos[arrow]=Q->tu+1;
????? if (arrow<M.mu) tp=M.rpos[arrow+1];
????? else tp=M.tu+1;
????? for (p=M.rpos[arrow];p<tp;++p) {
??????? brow=M.data[p].j;
??????? if (brow<N.mu) t=N.rpos[brow+1];
??????? else {t=N.tu+1;}?
??????? for (q=N.rpos[brow]; q<t; ++q) {
????????? ccol=N.data[q].j;????????
????????? //printf("ctemp[ccol]=%d\n",ctemp[ccol]);
????????? ctemp[ccol]+=M.data[p].e * N.data[q].e;
????????? //printf("ccol=%d\n",ccol);
????????? //printf("M.data[p].e * N.data[q].e=%d * %d\n",M.data[p].e,N.data[q].e);
????????? //printf("ctemp[ccol]=%d\n",ctemp[ccol]);
????????? //printf("")
??????? }???
????? }???
????? for (ccol=1; ccol<=Q->nu;++ccol)
??????? if (ctemp[ccol]){
????????? if (++Q->tu>MAXSIZE) return ERROR;
????????? Q->data[Q->tu].i=arrow;
????????? Q->data[Q->tu].j=ccol;
????????? Q->data[Q->tu].e=ctemp[ccol];
??????? }??
??? }??????
? }??
}??????

void DestroySMatrix(TSMatrix M)
{
? M.mu=0;? M.nu=0;? M.tu=0;??
}????
?????????????????
int main(int argc, char *argv[])
{
? TSMatrix a,b,c,d,e;? //è?1?D′?a*a£??ò±?D??óé?a=(TSMatrix *)malloc(sizeof(TSMatrix)),?ò?óò?TSMatrix b,a=&b;
? TSMatrix aa,bb,cc;
? int array[A][B]={{0,12,9,0,0,0,0},{0,0,0,0,0,0,0},{-3,0,0,0,0,14,0},{0,0,24,0,0,0,0},{0,18,0,0,0,0,0},{15,0,0,-7,0,0,0}};
? int array1[A][B]={{0,12,3,4,0,0,0},{0,0,0,3,0,0,0},{-3,0,0,0,0,14,0},{0,0,24,0,0,0,0},{0,18,0,0,0,0,0},{15,0,0,-7,0,0,0}};
?
? int array2[A1][B1]={{3,0,0,5},{0,-1,0,0},{2,0,0,0}};
? int array3[A2][B2]={{0,2},{1,0},{-2,4},{0,0}};
?
? //a=(TSMatrix *)malloc(sizeof(TSMatrix));?
? CreatTripleTable(array,&a);
? PrintSMatrix(a);
? printf("Transpose\n");
? TransposeSMatrix(&a,&c);
? PrintSMatrix(c);
? printf("Fast Transpose\n");
? FastTransposeSMatrix(&a,&d);
? PrintSMatrix(d);???
?
? printf("Add Transpose\n");
? CreatTripleTable(array1,&b);?
? TSMatrix_Add(a,b,&e);
? PrintSMatrix(e);
???
? CreatTripleTable1(array2,&aa);
? PrintSMatrix(aa);
? CreatTripleTable2(array3,&bb);
? PrintSMatrix(bb);
? GetRpos(&aa);
? GetRpos(&bb);
? MultSMatrix(aa,bb,&cc);
? PrintSMatrix(cc);

? DestroySMatrix(a);
? DestroySMatrix(b);???????????????
? DestroySMatrix(c);
? DestroySMatrix(aa);
? DestroySMatrix(bb);???????????????
? DestroySMatrix(cc);
? system("PAUSE");?
? return 0;
}

轉載于:https://www.cnblogs.com/djcsch2001/archive/2011/05/03/2035167.html

總結

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费观看国产视频 | 岛国av噜噜噜久久久狠狠av | 男同志毛片特黄毛片 | 成人91在线 | 欧美久久久久 | 蜜臀av一区| 亚洲天堂一区二区三区四区 | 亚洲草逼 | 欧美在线一二三四区 | 少妇又色又爽又黄的视频 | 中文字幕av在线免费 | 欧美成人精品二区三区99精品 | 久久久久久久久成人 | 黄色录像二级片 | 国产夜夜嗨 | 青青视频免费 | 91综合色 | 仙踪林av| 日本少妇激三级做爰在线 | 波多野结衣导航 | 素人一区| 国产激情网站 | 又紧又大又爽精品一区二区 | 在线观看视频99 | 色悠久 | 粗大的内捧猛烈进出 | 国产精品无码成人片 | 国产区视频在线观看 | 亚州精品国产精品乱码不99按摩 | 欧美国产不卡 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲二区精品 | 无人码人妻一区二区三区免费 | www.av日韩 | 欧美顶级毛片在线播放 | 欧美精品一卡 | 色视频在线观看 | 亚洲日本韩国在线 | 成人av免费 | 亚洲国产精品成人va在线观看 | 女教师痴汉调教hd中字 | 精品久久久久久久久久岛国gif | 日韩五十路 | 欧美人xxx | 福利小视频 | 在线黄色免费 | 亚洲激情在线观看 | 一级黄色大片在线观看 | 欧美午夜免费 | 久久这里精品 | 亚洲欧美韩国 | 隣の若妻さん波多野结衣 | 成人午夜福利视频 | 成为性瘾网黄的yy对象后 | 国产毛片在线视频 | 成年人晚上看的视频 | 国产95在线 | 波多野结衣av在线免费观看 | www.97色| 无码人妻精品一区二区三区在线 | 免费在线观看a视频 | 国产r级在线观看 | 天天想你免费观看完整版高清电影 | 狠狠干精品 | 爆乳2把你榨干哦ova在线观看 | 尤物国产 | 一本色道久久hezyo加勒比 | 中文字幕在线视频一区二区 | 亚洲av片在线观看 | 在线播放国产视频 | 日日夜夜骑| 公车激情云雨小说 | 中文字幕精品亚洲 | 精品欧美激情精品一区 | 97国产精品久久 | 国产高清一区在线 | www日日日| 久久无码人妻丰满熟妇区毛片 | 加勒比不卡视频 | 免费看欧美一级特黄a大片 国产免费的av | 国产视频在线观看视频 | 手机看片福利在线 | 成年人精品视频 | 欧美成人播放 | 精品久久久久久亚洲精品 | 亚洲国产精品无码专区 | 久久久久免费精品 | 亚洲人成一区 | 日本黄色一区二区三区 | 欧美xxxxxxxxx| 久久综合社区 | 久久久久久无码午夜精品直播 | 日韩一级二级 | 亚洲天堂美女 | 精品熟女一区二区 | 明日花绮罗高潮无打码 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 日韩性爰视频 | 6996电视影片免费看 |