试编写实现矩阵C = A X B 操作的函数。设矩阵A、矩阵B和矩阵C的行列维数均为n,并采用压缩存储结构,矩阵元素均为int型
题目分析:
矩阵是一个二维平面的概念,而压缩矩阵就是要把这个平面进行压缩,即用一维数组来表示二维数组。
那应该怎样来表示二维数组?我们知道二维数组都有一个行列下标i和j,而一维数组只有一个下标k,我们只需要将k用i和j来表示,得到对应的关系式,就可以将矩阵存储到一维数组了
对应的关系是这样的:
考点:
k = i*n+j,k是一维数组的下标,i、j是二维数组的行、列
1.二维矩阵和一维矩阵的一一对应关系
2.矩阵的乘法法则以及代码实现
代码实现:
#include<stdio.h>
#include<stdlib.h>
/*输入数据创建矩阵,返回压缩后的矩阵(一维数组)*/
int* input(int n)
{
int *arr = (int *)malloc(sizeof(int)*(n*n));
printf("请输入 %d 个数:",n*n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
int number;
scanf_s("%d", &number); //从键盘获取数据
arr[i*n + j] = number; //将数据存储到一维数组相应位置上
}
printf("\n\n");
return arr; //返回一维数组
}
/*矩阵的乘法,返回一个一维数组,存放着压缩矩阵*/
int *mul(int A[], int B[], int n)
{
int *C = (int *)malloc(sizeof(int)*(n*n));
for (int i = 0; i < n*n; i++) //因为矩阵乘法涉及到加和过程,所以得把C数组中全部置0
C[i] = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int k = 0; k < n; k++)
{
C[i*n + j] += A[i*n + k] * B[k*n + j]; //矩阵乘法:C[i][j] += A[i][k]*B[k][j]
}
}
}
return C; //返回计算好的一维数组
}
/*输出矩阵*/
void output(int *arr, int n)
{
for (int i = 0; i < n*n; i++)
{
if (i % n == 0) //换行
printf("\n");
printf("%5d", arr[i]);
}
printf("\n");
}
int main()
{
int n;
printf("请输入矩阵的阶数:");
scanf_s("%d", &n);
int *A = (int *)malloc(sizeof(int)*(n*n));
int *B = (int *)malloc(sizeof(int)*(n*n));
int *C = (int *)malloc(sizeof(int)*(n*n));
printf("创建矩阵A:\n\n");
A = input(n);
printf("创建矩阵B:\n\n");
B = input(n);
C = mul(A, B, n);
printf("计算结果矩阵C如下:\n\n");
output(C,n);
system("pause");
return 0;
}
运行结果:
测试一
测试二
测试三
代码编译器:Visual Studio 2017
ok,没问题