题目描述
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同的 r x c 的新矩阵
若存在一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充
如果给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵
C 语言具体代码实现
作者本人的方法是先用一维数组保存二维数组,然后再还原!!!
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 4
int **test(int **mat, int m, int n, int r, int c){
if(m*n != r*c){
return mat;
}
// 用一维数组保存二维数组
int *arr = (int*)malloc(sizeof(int)*m*n);
int index = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
arr[index++] = mat[i][j];
}
} // arr[4] = {1, 2, 3, 4}
// 重塑矩阵
int **newmat;
newmat = (int**)malloc(r*sizeof(int*));
for(int i = 0; i < r; i++){
newmat[i] = (int*)malloc(c*sizeof(int));
}
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
newmat[i][j] = arr[i*c+j];
}
}
return newmat;
}
int main() {
int **array; // 二维数组
array = (int**)malloc(M*sizeof(int*));
for(int i = 0; i < M; i++){
array[i] = (int*)malloc(N*sizeof(int));
}
// 给二维数组赋值
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 3;
array[0][3] = 4;
array[1][0] = 5;
array[1][1] = 6;
array[1][2] = 7;
array[1][3] = 8;
// 调用函数
int r = 4, c = 2; // 新数组的行和列
int **arr = test(array, M, N, r, c);
// 打印新数组
for(int i = 0; i < r; i++){
for(int j = 0; j < c; j++){
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}