童鞋,不知道你是用的什么測試數(shù)據(jù),在我的機器上測試了幾組數(shù)據(jù),結(jié)果都是正確的。
新巴爾虎左ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
重復(fù)下我的測試代碼。
#include
"stdio.h"
#include
"stdlib.h"
#include
"malloc.h"
void
multiplication(int
a,int
b,int
c,int
*p,int
*q);
void
main()
{
int
m,n,l,h;
int
i,j,g,k;
int
*p,*q;
char
x;
printf("請輸入a矩陣行數(shù)和列數(shù),以空格分開,,,");
scanf("%d
%d",m,n);
p=(int
*)malloc(sizeof(int)*m*n);
for(i=0;im;i++)
for(j=0;jn;j++)
{
printf("請輸入a矩陣%d行%d列的數(shù),,",(i+1),(j+1));
scanf("%d",(p+m*i+j));
}
printf("請輸入b矩陣行數(shù)和列數(shù),以空格分開,,,");
scanf("%d
%d",l,h);
q=(int
*)malloc(sizeof(int)*l*h);
for(g=0;gl;g++)
for(k=0;kh;k++)
{
printf("請輸入b矩陣%d行%d列的數(shù),,",(g+1),(k+1));
scanf("%d",(q+l*g+k));
}
multiplication(
m,
n,
h,
p,
q);
}
void
multiplication(int
a,int
b,int
c,int
*p,int
*q)
{
int
i,j;
int
k;
int
sum;
for(i=0;ia;i++)
{
for(j=0;jc;j++)
{
sum=0;
for(k=0;kb;k++)
{
sum=sum+(*(p+a*i+k))*(*(q+b*k+j));
}
printf("%d
",sum);
}
printf("\n");
}
}
附帶一組測試數(shù)據(jù)
A
3
4
2
1
B
3
4
Result
25
10
結(jié)果正確。
//矩陣三元組之矩陣相加 相乘
#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) //矩陣的轉(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]; //存放每行非零元素的個數(shù)
int *rowStart=new int[T.mu+2]; //矩陣每行在三元組開始位置
int *temp=new int[T.nu+1]; //存放結(jié)果矩陣中每行的計算結(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ù)中元素的行號
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)前元素的列號,方便與T矩陣的行號相乘
for(i=rowStart[COLM];irowStart[COLM+1];i++) //對應(yīng)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;
}
上面那個程序是我寫的,下面寫的是兩個2*2矩陣相加和相乘的程序(行數(shù)和列數(shù)可以在主函數(shù)中更改),不得不說一句,有關(guān)矩陣的東西就是麻煩:
#include stdio.h
#include stdlib.h
int** NewMatrix(int row,int col) //動態(tài)開辟一個數(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;
//動態(tài)建立一個矩陣空間以存放運算結(jié)果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;irow;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//計算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;
//動態(tài)建立一個矩陣空間以存放運算結(jié)果
matrix=(int **)malloc(sizeof(int *)*row);
for(i=0;irow;i++)
{
matrix[i]=(int*)malloc(sizeof(int)*col);
}
//計算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); //動態(tài)建立矩陣a
b = NewMatrix(row,col); //動態(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]);
}
}
}
本來程序還可以寫得簡單一些,由于你要求兩矩陣同時能夠相加和相乘,從而可以判定兩矩陣的行數(shù)和列數(shù)應(yīng)該是相等的,因而在函數(shù)傳遞參數(shù)的時候只要傳一個就行了。但是考慮到程序的可移植性,我在寫相加和相乘的子函數(shù)時,考慮了普遍性,即對于給定的任意的row和col(甚至row != col),加法和乘法都能夠適用。然而這樣一來,形參看起來就比較多了。你自己就情況而定吧,不懂的地方發(fā)我消息。
1、程序運行輸入數(shù)據(jù)時,第一行為A矩陣的行列數(shù)和B矩陣的行列數(shù),接著分別輸入A、B兩個矩陣的值。
2、首先,定義6個整型變量,保存A、B矩陣的行和列,以及控制循環(huán)的變量,k則用于實現(xiàn)矩陣的乘法。
3、接著,定義三個整型二維數(shù)組,保存A、B和C矩陣的各元素。
4、輸入三個矩陣的行數(shù)和列數(shù),保存在變量a、b、c中。
5、輸入矩陣A的各元素,保存在數(shù)組X中。
6、輸入矩陣B的各元素,保存在數(shù)組Y中。
7、將二維數(shù)組Z的各元素,初始化為0。
8、用兩層for循環(huán),控制矩陣的乘法,并輸出乘法所得的結(jié)果。
9、計算A矩陣和B矩陣的乘法,結(jié)果保存在數(shù)組Z中。
10、最后,輸出乘法所得的結(jié)果,即輸出Z數(shù)組中的所有元素。
11、運行程序,輸入矩陣A和B的行數(shù)和列數(shù),以及A矩陣和B矩陣的所有元素,電腦就會計算出乘積C矩陣的所有元素,并輸出C矩陣。