
#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语言 矩阵乘法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)