方法:左边矩阵第一行的元素分别与右边矩阵第一列的元素相乘,求和得到相乘矩阵的第一行的历迅第一个元素。左边矩阵第一行的元素分别与右边矩阵第二液闹列的元素相乘,求和得到相乘矩阵的第一行的第二个元素,以此类推。
值得注意的是,当提及“矩阵相乘”或者“矩阵乘法”的时候,并不是指代这些特殊的乘积形式,而是定义中所描述的矩阵乘法。在描述这些特殊乘积闹烂罩时,使用这些运算的专用名称和符号来避免表述歧义。
矩阵乘法注意事项
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。
可以调用 matrix2() 或 matrix() 做矩阵相乘。下面主函数 以 调用 matrix() 为例,介绍过程:
输入参数,动态分配数组友念,输入矩阵数据,调用,输出,释放内存。
#include<iostream>
using namespace std
#include<stdio.h>
/*---------------------
c[j]][i] = a[j][k] * b[k][i] = c[j][i]
a[ny][nk]
b[nk][nx]
c[ny][nx]
*---------------------*/
void matrix2(int *a,int *b, int *c, int nx, int ny, int nk)
{
int i,j,k
for(j=0j<nyj++){
for(i=0i<nxi++){
c[j*nx+i]=0
for(k=0k<nkk++)c[j*nx+i]+= a[j*nk+k] * b[k*nx+i]
}
}
}
/*---------------------
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=0j<nyj++)for(i=0i<nxi++)a[j][i]= 0
for(j=0j<nyj++){
for(i=0i<nxi++){
for(k=0k<nkk++)a[j][i]+= b[j][k]*c[k][i]
}
}
}
int 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
printf("please enter b_row b_col of matrix B\n")
scanf("%d %d"羡粗,&b_row,&b_col)
c_row = b_col
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=0j<a_rowj++){
a[j] = (int *) malloc(sizeof(int) * a_col)
}
b = (int **) malloc(sizeof(int *) * b_row)
for (j=0j<b_rowj++){
b[j] = (int *) malloc(sizeof(int) * b_col)
}
c = (int **) malloc(sizeof(int *) * c_row)
for (j=0j<兄告镇c_rowj++){
c[j] = (int *) malloc(sizeof(int) * c_col)
}
if (!c[c_row-1]) {
printf("no enought memory\n")exit(0)
}
printf("Please input int matrix b[%d][%d]\n",b_row,b_col)
for (j=0j<b_rowj++)
for (i=0i<b_coli++){
scanf("%d",&tmp)
b[j][i] = tmp
}
printf("Please input int matrix c[%d][%d]\n",c_row,c_col)
for (j=0j<c_rowj++)
for (i=0i<c_coli++){
scanf("%d",&tmp)
c[j][i] = tmp
}
matrix( b ,c,a, a_col, a_row, b_col)
for(j=0j<a_rowj++)
{
for (i=0i<a_coli++) printf("%d ",a[j][i])
printf("\n")
}
for (i=0i<a_rowi++) free((void *)a[i])free((void *)a)
for (i=0i<b_rowi++) free((void *)b[i])free((void *)b)
for (i=0i<c_rowi++) free((void *)c[i])free((void *)c)
return 0
}
数据和结果例子:
please enter b_row b_col of matrix B
3 2
please enter c_col of matrix C
3
Please input int matrix b[3][2]
1 2 3 4 5 6
Please input int matrix c[2][3]
1 2 3 4 5 6
9 12 15
19 26 33
29 40 51
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)