//矩陣三元組之矩陣相加 相乘
10年積累的網站制作、做網站經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站制作后付款的網站建設流程,更有蒼梧免費網站建設讓你可以放心的選擇與我們合作。
#include iostream
using namespace std;
typedef int Elemtype;
#define MAXSIZE 12500 //最大非零元素
typedef struct Triple
{
Elemtype value;
int row,col;
}Triple;
typedef struct TSMatrix
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
TSMatrix T;
void InputMatrix(TSMatrix T) //輸入t個非零元素
{
cout"請輸入稀疏矩陣的信息,(行,列,非零元素個數(shù))"endl;
cinT.muT.nuT.tu;
int i;
cout"請輸入非零元素的信息(行,列,值),提醒(下標從1開始)"endl;
for(i=1;i=T.tu;++i)
{
cinT.data[i].rowT.data[i].colT.data[i].value;
}
}
void Output(TSMatrix T)
{
cout"矩陣的三元組表示(ROW=)"T.mu" COL="T.nu"非零個數(shù)="T.tuendl;
int i;
for(i=1;i=T.tu;++i)
{
cout"ROW(行):"T.data[i].row" COL(列):"T.data[i].col" Value(值)"T.data[i].valueendl;
}
}
void TransposeSMatrix(TSMatrix M,TSMatrix T) //矩陣的轉置
{
T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
int i,j,k=1;
for(i=1;i=M.nu;++i)
{
for(j=1;j=M.tu;++j)
if(M.data[j].col==i)
{
T.data[k].row=i;
T.data[k].col=M.data[j].row;
T.data[k].value=M.data[j].value;
++k;
}
}
}
void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix Q) //矩陣相加
{
int index_a,index_b,i=1,j=1,k=1;
Q.mu=M.mu; Q.nu=M.nu;
while (i=M.tuj=T.tu)
{
index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col;
index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col;
if(index_aindex_b)
{
Q.data[k]=M.data[i];
i++;
k++;
}
else if(index_aindex_b)
{
Q.data[k]=T.data[j];
j++;
k++;
}
else if(index_a==index_b)
{
if((M.data[i].value+T.data[j].value)!=0)
{
Q.data[k]=M.data[i];
Q.data[k].value=M.data[i].value+T.data[j].value;
k++;
}
++i;
++j;
}
}
//復制剩余元素
for(;i=M.tu;++i)
{
Q.data[k]=M.data[i];
k++;
}
for(;j=T.tu;++j)
Q.data[k++]=T.data[j];
Q.tu=k-1;
}
void Multiply(TSMatrix M,TSMatrix T,TSMatrix Q) //相乘
{
if(M.nu!=T.mu)
{
cerr"兩矩陣相乘不合法"endl;
return ;
}
int *rowSize=new int[T.mu+1]; //存放每行非零元素的個數(shù)
int *rowStart=new int[T.mu+2]; //矩陣每行在三元組開始位置
int *temp=new int[T.nu+1]; //存放結果矩陣中每行的計算結果
int i,Current,k,ROWM,COLM,COLB;
for(i=1;i=T.mu;i++) rowSize[i]=0;
for(i=1;i=T.tu;++i) rowSize[T.data[i].row]++;
rowStart[1]=1;
for(i=2;i=T.mu+1;i++)
rowStart[i]=rowStart[i-1]+rowSize[i-1];
Current=1; k=1;
while (Current=M.tu)
{
ROWM=M.data[Current].row; //當前三元組數(shù)據中元素的行號
for(i=1;i=T.nu;++i) temp[i]=0;
while (Current=M.tuROWM==M.data[Current].row)
{
COLM=M.data[Current].col; //當前元素的列號,方便與T矩陣的行號相乘
for(i=rowStart[COLM];irowStart[COLM+1];i++) //對應T矩陣中每行的個數(shù)
{
COLB=T.data[i].col;
temp[COLB]+=(M.data[Current].value)*(T.data[i].value);
}
Current++;
}
for(i=1;i=T.nu;i++)
{
if(temp[i]!=0)
{
Q.data[k].row=ROWM;
Q.data[k].col=i;
Q.data[k].value=temp[i];
}
k++;
}
}
Q.mu=M.mu;Q.nu=T.nu;
Q.tu=k-1;
}
int main()
{
TSMatrix T,M,Q,S;
InputMatrix(M);
InputMatrix(T);
cout"兩矩陣相乘"endl;
Multiply(M,T,Q);
Output(Q);
cout"兩矩陣相加"endl;
AddMastrix(M,M,S);
Output(S);
system("pause");
return 0;
}
你的測試數(shù)據不符合條件,不是對稱矩陣。但函數(shù)調試已調試好了,無誤。
#include stdio.h
#define N 3
#define M (N*N+N)/2
void add(int C[],int A[],int B[])
{
for(int i=0;iM;i++)
C[i]=A[i]+B[i];
}
void print(int C[])
{
int i,j,t;
for(i=0;iN;i++)
{
for(int j=0;jN;j++)
{
if(i=j) t=(i+1)*i/2+j;
else t=(j+1)*j/2+i; //下三角存儲
printf("%d ",C[t]);
}
printf("\n");
}
}
int main(void)
{
int a[N][N]={{1,2,3},{10,20,30},{2,4,5}};
int b[N][N]={{20,40,50},{3,5,6},{30,50,60}};
int A[M],B[M],C[M];
int i,j,t=0,k=0;
for(i=0;i=2;i++)
for(j=0;j=i;j++)
{
A[t++]=a[i][j];
B[k++]=b[i][j];
}
add(C,A,B);
print(C);
return 0;
}
用二維數(shù)組,如下:
#include stdio.h
main()
{
int i, j, a[4][4];
for ( i = 1; i 4; i++ )
{
for ( j = 1; j 4; j++ )
{
scanf ("%d", a[i][j]);
}
}
//這樣就可以將一個3*3 的矩陣存在2維數(shù)組中了
for ( i = 1; i 4; i++ )
{
for ( j = 1; j 4; j++ )
{
printf (" %-4d ", a[i][j]);
}
printf ("\n");
}
//這樣就可以顯示矩陣
return 0;
}
網站欄目:c語言s形矩陣函數(shù) c語言n×n矩陣
標題路徑:http://muchs.cn/article34/doeocpe.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計、手機網站建設、App開發(fā)、商城網站、全網營銷推廣、網頁設計公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)