编程实现任意两个矩阵的相乘

编程实现任意两个矩阵的相乘,第1张

#include<stdioh>

#define M 10

#define N 10

void matrix(int a[M][N],int m,int n)

{

int i,j;

for(i=0;i<m;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);

}

void comput(int a[M][N],int b[M][N],int c[M][N],int m1,int n1,int m2,int n2)

{

int i,j,k,sum;

for(i=0;i<m1;i++)

for(j=0;j<n2;j++)

{

sum=0;

for(k=0;k<n1;k++)

sum=sum+a[i][k]b[k][j];

c[i][j]=sum;

}

}

void print(int c[M][N],int m,int n)

{

int i,j;

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)

printf("%3d",c[i][j]);

printf("\n");

}

}

void main()

{

int m,n,r,p,a[M][N],b[M][N],c[M][N];

printf("输入第一个矩阵的行数与列数");

scanf("%d%d",&m,&n);

matrix(a,m,n);

printf("输入第二个矩阵的行数与列数");

scanf("%d%d",&r,&p);

matrix(b,r,p);

comput(a,b,c,m,n,r,p);

print(c,m,p);

}

#include<iostreamh>

#include<stdlibh>

#include<iomaniph>

void caidan();

#define max 12500

typedef struct{

int e;

int i; //行下标

int j; //列下标

}triple;

typedef struct{

triple data[max+1];

int rpos[10];

int m,n,t;

}ts;

//矩阵的转置实现函数

void fasttransposesmatrix(ts M,ts &T)

{

int col,num[10],cpot[10]={0},p,q;

Tm=Mn;

Tn=Mm;

Tt=Mt;

if(Tt){

for(col=1;col<=Mn;++col)

num[col]=0;

for(int t1=1;t1<=Mt;++t1)

++num[Mdata[t1]j];

cpot[1]=1;

for(col=2;col<=Mn;++col)

cpot[col]=cpot[col-1]+num[col-1];

for(p=1;p<=Mt;++p){

col=Mdata[p]j;

q=cpot[col];

Tdata[q]i=Mdata[p]j;

Tdata[q]j=Mdata[p]i;

Tdata[q]e=Mdata[p]e;

++cpot[col];

}

}

}

//矩阵的乘法Y=MQ实现函数

void multsmatrix(ts M,ts Q,ts &Y){

int arow,brow=0,p,q,i1,tp,t1,ctemp[10],ccol;

if(Mn!=Qm)

cout<<"错误!"<<endl;

Ym=Mm;

Yn=Qn;

Yt=0;

if(MtQt!=0)

{

for(arow=1;arow<=Mm;++arow)

{

for(i1=1;i1<=Mm;i1++)

ctemp[i1]=0;

Yrpos[arow]=Yt+1;

if(arow<Mm)

tp=Mrpos[arow+1];

else

tp=Mt+1;

for(p=Mrpos[arow];p<tp;++p)

{

brow=Mdata[p]j;

if(brow<Qm)

t1=Qrpos[brow+1];

else

t1=Qt+1;

for(q=Qrpos[brow];q<t1;++q)

{

ccol=Qdata[q]j;

ctemp[ccol]+=Mdata[p]eQdata[q]e;

}

}

for(ccol=1;ccol<=Yn;++ccol)

if(ctemp[ccol]){

++Yt;

if(++Yt>max)

cout<<"错误"<<endl;

Ydata[Yt]i=arow;

Ydata[Yt]j=ccol;

Ydata[Yt]e=ctemp[ccol];

cout<<Ydata[Yt]i<<Ydata[Yt]j<<Ydata[Yt]e<<endl;

}

}

}

}

//将数组转换成三元组

void exchange1(int a,ts &M,int m,int n)

{

int i1,j1,z=1,pos[10];

for(i1=0;i1<=n;i1++)

{

pos[i1]=0;

Mrpos[i1]=0;

}

pos[0]=1;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

if(a[i1][j1])

{

Mdata[z]i=i1+1;

Mdata[z]j=j1+1;

Mdata[z]e=a[i1][j1];

z++;

pos[i1+1]++;

}

for(i1=0;i1<=m;i1++)

{

Mrpos[i1+1]=Mrpos[i1]+pos[i1];

}

Mt=z-1;

Mm=m;

Mn=n;

}

//将三元组转换成数组形式

void exchange2(int a,ts &T)

{

int i1,j1,z1;

for(i1=0;i1<Tm;i1++)

for(j1=0;j1<Tn;j1++)

{

a[i1][j1]=0;

}

for(z1=1;z1<=Tt;z1++)

for(i1=0;i1<Tm;i1++)

for(j1=0;j1<Tn;j1++)

if((i1==Tdata[z1]i-1)&&(j1==Tdata[z1]j-1))

{

a[i1][j1]=Tdata[z1]e;

}

}

//输出结果

void output(int a,int m,int n)

{

int i1,j1;

for(i1=0;i1<m;i1++)

{

for(j1=0;j1<n;j1++)

{

cout<<a[i1][j1]<<',';

}cout<<endl;

}

}

//转置的 *** 作函数

void zhuanzhi(){

int i1,j1,m,n;

cout<<"初始矩阵:"<<endl;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intpp=new int[m];

for(i1=0;i1<m;i1++)

pp[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>pp[i1][j1];

}

cout<<endl;

ts M,T;

exchange1(pp,M,m,n);

fasttransposesmatrix(M,T);

intpp1=new int[Tm];

for(i1=0;i1<Tm;i1++)

pp1[i1]=new int[Tn];

exchange2(pp1,T);

cout<<"转置后的矩阵是:"<<endl;

output(pp1,Tm,Tn);

delete pp;

delete pp1;

caidan();

}

//相乘的 *** 作函数

void xiangcheng(){

ts M,Q,Y;

int i1,j1,m,n;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intp=new int[m];

for(i1=0;i1<m;i1++)

p[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>p[i1][j1];

}

cout<<endl;

exchange1(p,M,m,n);

cout<<"请再次输入一个矩阵(即乘数):"<<endl;

cout<<"请输入你要输入的数组的行数:"<<endl;

cin>>m;

cout<<"请输入你要输入的数组的列数:"<<endl;

cin>>n;

intp2=new int[m];

for(i1=0;i1<m;i1++)

p2[i1]=new int[n];

cout<<"请依次输入矩阵的元素:"<<endl;

for(i1=0;i1<m;i1++)

for(j1=0;j1<n;j1++)

{

cin>>p2[i1][j1];

}

cout<<endl;

exchange1(p2,Q,m,n);

multsmatrix(M,Q,Y);

intp1=new int[Ym];

for(i1=0;i1<Ym;i1++)

p1[i1]=new int[Yn];

exchange2(p1,Y);

cout<<"两矩阵相乘结果为:"<<endl;

output(p1,Ym,Yn);

delete p2;

delete p1;

caidan();

}

//菜单

void caidan()

{

int i;

cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;

cout<<" 1矩阵的转置 2两个矩阵的乘法 3退出 "<<endl;

cout<<"请选择:"<<endl;

cin>>i;

switch(i){

case 1:zhuanzhi();

break;

case 2:xiangcheng();

break;

case 3: exit(0);

}

}

//主函数

void main()

{

caidan();

}

矩阵乘法程序,动态分配内存:

#include<stdioh>

// b[j][k] c[k][i] = a[j][i]

void matrix(int b,int c, int a, int nx, int ny, int nk)

{

int i,j,k;

for (j=0;j<ny;j++)for(i=0;i<nx;i++)a[j][i]= 0;

for(j=0;j<ny;j++){

for(i=0;i<nx;i++){

for(k=0;k<nk;k++)a[j][i]+= b[j][k]c[k][i];

};

};

}

void main()

{

int i,j,k,tmp;

int b_row,b_col;

int c_row,c_col;

int a_row,a_col;

int b,c,a;

// 输入B 阵 行数 列数

printf("please enter b_row b_col of matrix B\n");

scanf("%d %d",&b_row,&b_col);

c_row = b_col;

// 输入C阵 列数

printf("please enter c_col of matrix C\n");

scanf("%d",&c_col);

a_row = b_row;

a_col = c_col;

a = (int ) malloc(sizeof(int ) a_row);

for (j=0;j<a_row;j++){

a[j] = (int ) malloc(sizeof(int) a_col);

}

b = (int ) malloc(sizeof(int ) b_row);

for (j=0;j<b_row;j++){

b[j] = (int ) malloc(sizeof(int) b_col);

}

c = (int ) malloc(sizeof(int ) c_row);

for (j=0;j<c_row;j++){

c[j] = (int ) malloc(sizeof(int) c_col);

}

if (!c[c_row-1]) {

printf("no enought memory\n");exit(0);

}

// 输入B阵元素

printf("Please input int matrix b[%d][%d]\n",b_row,b_col);

for (j=0;j<b_row;j++)

for (i=0;i<b_col;i++){

scanf("%d",&tmp);

b[j][i] = tmp;

}

// 输入C阵元素

printf("Please input int matrix c[%d][%d]\n",c_row,c_col);

for (j=0;j<c_row;j++)

for (i=0;i<c_col;i++){

scanf("%d",&tmp);

c[j][i] = tmp;

}

matrix( b ,c,a, a_col, a_row, b_col);

for(j=0;j<a_row;j++)

{

for (i=0;i<a_col;i++) printf("%d ",a[j][i]);

printf("\n");

};

}

方法:左边矩阵第一行的元素分别与右边矩阵第一列的元素相乘,求和得到相乘矩阵的第一行的第一个元素。左边矩阵第一行的元素分别与右边矩阵第二列的元素相乘,求和得到相乘矩阵的第一行的第二个元素,以此类推。

值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积时,使用这些运算的专用名称和符号来避免表述歧义。

矩阵乘法注意事项

1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。

2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。

3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

以上就是关于编程实现任意两个矩阵的相乘全部的内容,包括:编程实现任意两个矩阵的相乘、C语言:编写完整程序:计算两个矩阵的乘积。、c语言 矩阵乘法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9331928.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存