设计一个矩阵相乘的程序
假设有
1 5 7 3 3 9 1 4 1 4
A= 3 6 3 9 B= 5 6 7 9 0 3
1 2 8 7 3 2 7 2 5 6
0 3 1 9 9 7 4 7 8 0
3 2 5 4
求出A*B的矩阵
程序构思:
我们所知的矩阵乘法运算的算式如下:
Cij = Aik X Bkj 的k从1到 n 的和,那么可以用一个3层循环来运算此算式:
C(1,1)=A(1,1)*B(1,1)+A(1,2)*B(2,1)+A(1,3)*B(3,1)+A(1,4)*B(4,1)
=(1*3)+(5*5)+(7*3)+(3*9)
=3+25+21+27
=76
同理
C(1,2)=A(1,1)*B(1,2)+A(1,2)*B(2,2)+A(1,3)*B(3,2)+A(1,4)*B(2,2)
=(1*9)+(5*6)+(7*2)+(3*7)
=9+30+14+21
=74
依此类推,我们可以求得矩阵A与矩阵B的矩阵乘积。
void main(void)
{
int matrixa[5][4]={1,5,7,3,
3,6,3,9,
1,2,8,7,
0,3,1,9,
3,2,5,4};
int matrixb[4][6]={3,9,1,4,1,4,
5,6,7,9,0,3,
3,2,7,2,5,6,
9,7,4,7,8,0};
int matrixc[5][6];
int i,j,k;
for(i=0;i<5;i++)
for(j=0;j<6;j++)
{
matrixc[i][j]=0;
for(k=0;k<4;k++)
matrixc[i][j]+=matrixa[i][k]*matrixb[k][j];
}
printf("The matrix A:/n");
for(i=0;i<5;i++)
{
for(k=0;k<4;k++)
printf("%5d",matrixa[i][k]);
printf("/n");
}
printf("/nThe matrixb:/n");
for(k=0;k<4;k++)
{
for(j=0;j<6;j++)
printf("%5d",matrixb[k][j]);
printf("/n");
}
printf("/nMatrix C=Matrix A* Matrix B/n");
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
printf("%5d",Matrixc[i][j]);
printf("/n");
}
}
运行结果:
The Matrix A:
1 5 7 3
3 6 3 9
1 2 8 7
0 3 1 9
3 2 5 4
The Matrix B:
3 9 1 4 1 4
5 6 7 9 0 3
3 2 7 2 5 6
9 7 4 7 8 0
Matrix C=Matrix A*Matrix B:
76 74 97 84 60 61
129 132 102 135 90 48
100 86 99 87 97 58
99 83 64 92 77 15
70 77 68 68 60 48
二维数组行列互换
程序实例:
设计一个能将二维数组转换成以列为主的一维数组和以行为主的一维数组。
默认二维数组数据为:
9 7 6 6
3 5 3 3
Data = 6 6 4 7
7 5 1 4
1 2 8 0
程序构思:
依题意知道,本程序所运用的数据结构为“二维数组”,上报为进行数组以列为主和以行为主的转换。
已知该二维数组的大小为 5*4
以行为主的数组转换公式为:
Data[i][j]的位置=(i*4)+j
以列为主的数组的转换公式为:
Data[i][j]的位置=(j*5)+i
声明一个大小为20的一维数组,用来存久违转换以列为主后的数据,并声明一个大小为20的一维数组,用来存久违转换后以行为主的数据。
void main(void)
{
int data[5][4]={ 9,7,6,6,
3,5,3,5,
6,6,4,7,
7,5,1,4,
1,2,8,0};
int rawdata[20];
int coldata[20];
int i,j;
printf("The Data of two dimensional array:/n");
for(i=0;i<5;i++)
{
for(j=0;j<4;j++)
printf("%4d",data[i][j]);
printf("/n");
}
for(i=0;i<5;i++)
for(j=-;j<4;j++)
rowdata[i*4+j]=data[i][j];
printf("/nThe Row Major Matrix:/n");
for(i=0;i<20;i++)
printf("%3d",rowdata[i]);
printf("/n");
for(i=0;i<5;i++)
for(j=0;j<4;j++)
coldata[j*5+i]=data[i][j];
printf("/nThe Column Major Matrix:/n");
for(i=0;i<20;i++)
printf("%3d",coldata[i]);
printf("/n");
}
运行结果:
The Data of two dimension array:
9 7 6 6
3 5 3 3
6 6 4 7
7 5 1 4
1 2 8 0
The Row Major Matrix:
9 7 6 6 3 5 3 3 6 6 4 7 7 5 1 4 1 2 8 0
9 3 6 7 1 7 5 6 5 2 6 3 4 1 8 6 3 7 4 0
练习实例:
假设有一个浮点数二维数组共有15列11行。数据存储方式是以行为主,且在内存上的起始地址是30,现在要求出数组中第三行第5 列的元素在内存中的地址。
练习解答:
由题意可以知道,以行为主存储:
Data[i][j]的内存位置=X+[(i*R)+j]*M
1)浮点数二维数组-->每个元素占用的空间为4个字节,M=4
2)数组大小为共有15列11行--->R=15
3)起始地址是30--->X=30
Data[3][5]的内存位置=30+[(3*15)+5]*4=150
练习实例:
假设数组Demo如下:
3 9 1 4 1 4
5 6 7 9 0 3
Demo = 3 2 7 2 5 6
9 7 4 7 8 0
求出该数组以列为主和以行为主转换成一维数组后的相对位置
练习解答:
1)以行为主:
一维数组中的位置 | 0 | 1 | 2 | 3 | ... | 19 | 20 | 21 | 22 | 23 |
在原数组中的位置 | (0,0) | (0,1) | (0,2) | (0,3) | (3,1) | (3,2) | (3,3) | (3,4) | (3,5) | |
内容值 | 3 | 9 | 1 | 4 | ... | 7 | 4 | 7 | 8 | 0 |
以列为主:
一维数组中的位置 | 0 | 1 | 2 | 3 | ... | 19 | 20 | 21 | 22 | 23 |
在原数组中的位置 | (0,0) | (1,0) | (2,0) | (3,0) | (3,4) | (0,5) | (1,5) | (2,5) | (3,5) | |
内容值 | 3 | 5 | 3 | 9 | ... | 8 | 4 | 3 | 6 | 0 |