下面主函数 以 调用 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
回答:
此题2行2列矩阵乘以2行3列矩阵。
所得的矩阵是:2行3列矩阵
最后结果为: |1 3 5|
|0 4 6|
拓展资料
1、确认矩阵是否可以相乘。只有第一个矩阵的列的个数等于第二个矩阵的行的个数,这样的两个矩阵才能相乘。
图示的两个矩阵可以相乘,因为第一个矩阵,矩阵A有3列,而第二个矩阵,矩阵B有3行。
2、计算结果矩阵的行列数。画一个空白的矩阵,来代表矩阵乘法的结果。矩阵A和矩阵B相乘得到的矩阵,与矩阵A有相同的行数,与矩阵B有相同的列数。你可以先画出白格来代表结果矩阵中的行列数。
矩阵A有2行,所以结果矩阵也有2行。
矩阵B有2列,所以结果矩阵也有2列。
最终的结果矩阵就有2行2列。
3、计算第一个“点”。要计算矩阵中的第一个“点”,你需要用第一个矩阵第一行的第一个数乘以第二个矩阵第一列的第一个数,第一行的第二个数乘以第一列的第二个数,第一行的第三个数乘以第一列的第三个数,然后将这三个结果加到一起,得到第一个点。先来计算一下结果矩阵中第二行第二列的数,下面是算法:
6 x -5 = -30
1 x 0 = 0
2 x 2 = -4
-30 + 0 + (-4) = -34
结果是-34,对应了矩阵最右下角的位置。
在你计算矩阵乘法时,结果所处的行列位置要满足,行和第一个矩阵的行相同,列和第二个矩阵的列相同。比如,你用矩阵A最下面一行的数乘以矩阵B最右一列的数,得到的结果是-34,所以-34应该是结果矩阵中最右下角的一个数。
4、计算第二个“点”。比如计算最左下角的数,你需要用第一个矩阵最下面一行的数乘以第二个矩阵最左列的数,然后再把结果相加。具体计算方法和上面一样。
6 x 4 = 24
1 x (-3) = -3
(-2) x 1 = -2
24 + (-3) + (-2) = 19
结果是-19,对应矩阵左下角的位置。
5、在计算剩下的两个“点”。要计算左上角的数,用矩阵A的最上面一行的数乘以矩阵B左侧一列的数,下面是具体算法:
2 x 4 = 8
3 x (-3) = -9
(-1) x 1 = -1
8 + (-9) + (-1) = -2
结果是-2,对应的位置是左上角。
要计算右上角的数,用矩阵A的最上面一行的数乘以矩阵B右侧一列的数,下面是具体算法:
2 x (-5) = -10
3 x 0 = 0
(-1) x 2 = -2
-10 + 0 + (-2) = -12
结果是-12,对应的位置是右上角。
6、检查相应的数字是否出现在正确的位置。19在左下角,-34在右下角,-2在左上角,-12在右上角。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)