函數(shù)類(lèi)型是根據(jù)有無(wú)返回值判斷的,無(wú)返回值就把函數(shù)定義為void類(lèi)型
為寧遠(yuǎn)等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及寧遠(yuǎn)網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、寧遠(yuǎn)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
如果是單純輸出矩陣那就不用返回了,如果還要傳回主函數(shù)有其它應(yīng)用那就返回吧
1、程序運(yùn)行輸入數(shù)據(jù)時(shí),第一行為A矩陣的行列數(shù)和B矩陣的行列數(shù),接著分別輸入A、B兩個(gè)矩陣的值。
2、首先,定義6個(gè)整型變量,保存A、B矩陣的行和列,以及控制循環(huán)的變量,k則用于實(shí)現(xiàn)矩陣的乘法。
3、接著,定義三個(gè)整型二維數(shù)組,保存A、B和C矩陣的各元素。
4、輸入三個(gè)矩陣的行數(shù)和列數(shù),保存在變量a、b、c中。
5、輸入矩陣A的各元素,保存在數(shù)組X中。
6、輸入矩陣B的各元素,保存在數(shù)組Y中。
7、將二維數(shù)組Z的各元素,初始化為0。
8、用兩層for循環(huán),控制矩陣的乘法,并輸出乘法所得的結(jié)果。
9、計(jì)算A矩陣和B矩陣的乘法,結(jié)果保存在數(shù)組Z中。
10、最后,輸出乘法所得的結(jié)果,即輸出Z數(shù)組中的所有元素。
11、運(yùn)行程序,輸入矩陣A和B的行數(shù)和列數(shù),以及A矩陣和B矩陣的所有元素,電腦就會(huì)計(jì)算出乘積C矩陣的所有元素,并輸出C矩陣。
//矩陣三元組之矩陣相加 相乘
#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個(gè)非零元素
{
cout"請(qǐng)輸入稀疏矩陣的信息,(行,列,非零元素個(gè)數(shù))"endl;
cinT.muT.nuT.tu;
int i;
cout"請(qǐng)輸入非零元素的信息(行,列,值),提醒(下標(biāo)從1開(kāi)始)"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"非零個(gè)數(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) //矩陣的轉(zhuǎn)置
{
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;
}
}
//復(fù)制剩余元素
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]; //存放每行非零元素的個(gè)數(shù)
int *rowStart=new int[T.mu+2]; //矩陣每行在三元組開(kāi)始位置
int *temp=new int[T.nu+1]; //存放結(jié)果矩陣中每行的計(jì)算結(jié)果
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; //當(dāng)前三元組數(shù)據(jù)中元素的行號(hào)
for(i=1;i=T.nu;++i) temp[i]=0;
while (Current=M.tuROWM==M.data[Current].row)
{
COLM=M.data[Current].col; //當(dāng)前元素的列號(hào),方便與T矩陣的行號(hào)相乘
for(i=rowStart[COLM];irowStart[COLM+1];i++) //對(duì)應(yīng)T矩陣中每行的個(gè)數(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;
}
上面那個(gè)程序是我寫(xiě)的,下面寫(xiě)的是兩個(gè)2*2矩陣相加和相乘的程序(行數(shù)和列數(shù)可以在主函數(shù)中更改),不得不說(shuō)一句,有關(guān)矩陣的東西就是麻煩:
#include stdio.h
#include stdlib.h
int** NewMatrix(int row,int col) //動(dòng)態(tài)開(kāi)辟一個(gè)數(shù)組
{
int i,j;
int** matrix;
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;irow;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//輸入矩陣的元素
printf("please input the array elements:\n") ;
for(i=0;irow;i++)
{
for(j=0;jcol;j++)
{
scanf("%d",matrix[i][j]);
}
}
return matrix;
}
//兩矩陣相加a[row][col]+b[row][col]
int **addMatrix(int** a,int** b,int row,int col)
{
int i,j;
int** matrix;
//動(dòng)態(tài)建立一個(gè)矩陣空間以存放運(yùn)算結(jié)果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;irow;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//計(jì)算a+b
for(i=0;irow;i++)
{
for(j=0;jcol;j++)
{
matrix[i][j] = a[i][j] + b[i][j];
}
}
return matrix;
}
//兩矩陣相乘a[row][com]*b[com][col]
int **multiplyMatrix(int **a,int **b,int row,int com,int col)
{
int i,j,k;
int** matrix;
//動(dòng)態(tài)建立一個(gè)矩陣空間以存放運(yùn)算結(jié)果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;irow;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//計(jì)算a+b
for(i=0;irow;i++)
{
for(j=0;jcol;j++)
{
matrix[i][j] = 0;
for(k=0;kcom;k++)
{
matrix[i][j] += a[i][k] * b[k][j];
}
}
}
return matrix;
}
void main()
{
int i,j;
int row = 2,col = 2; //行數(shù)和列數(shù)在此更改
int **a,**b,**c;
a = NewMatrix(row,col); //動(dòng)態(tài)建立矩陣a
b = NewMatrix(row,col); //動(dòng)態(tài)建立矩陣b
//調(diào)用函數(shù),求兩矩陣的和
c = addMatrix(a,b,row,col);
//輸出兩矩陣的和
printf("\na add b is:\n");
for(i=0;irow;i++)
{
printf("\n");
for(j=0;jcol;j++)
{
printf("%d ",c[i][j]);
}
}
//調(diào)用函數(shù),求兩矩陣的積
c = multiplyMatrix(a,b,row,row,col);
//輸出兩矩陣的積
printf("\na multiply b is:\n");
for(i=0;irow;i++)
{
printf("\n");
for(j=0;jcol;j++)
{
printf("%d ",c[i][j]);
}
}
}
本來(lái)程序還可以寫(xiě)得簡(jiǎn)單一些,由于你要求兩矩陣同時(shí)能夠相加和相乘,從而可以判定兩矩陣的行數(shù)和列數(shù)應(yīng)該是相等的,因而在函數(shù)傳遞參數(shù)的時(shí)候只要傳一個(gè)就行了。但是考慮到程序的可移植性,我在寫(xiě)相加和相乘的子函數(shù)時(shí),考慮了普遍性,即對(duì)于給定的任意的row和col(甚至row != col),加法和乘法都能夠適用。然而這樣一來(lái),形參看起來(lái)就比較多了。你自己就情況而定吧,不懂的地方發(fā)我消息。
分享標(biāo)題:c語(yǔ)言中矩陣函數(shù)的應(yīng)用 c語(yǔ)言實(shí)現(xiàn)矩陣
文章網(wǎng)址:http://jinyejixie.com/article26/doohhcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、網(wǎng)站建設(shè)、商城網(wǎng)站、、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)