我在C中有这个矩阵。
[1,2,3,4]
[5,6,7,8]
[9,10,11,12]
[13,14,15,16]
n x n,平方矩阵。
我需要将其拆分为四个矩阵:
[1,2] [3,4] [9,10] [11,12]
[5,6] [7,8] [13,14] [15,16]
这将在如下数组中表示:
array[16] = [1,2,5,6,3,4,7,8,9,10,13,14,11,12,15,16]
到目前为止,我已经这样做了:
int i,j;
int k = 0;
for(i = 0; i < 2; i++ )
{
for(j = 0; j < 2; j++)
{
array[k] = matrix[i][j];
k++;
}
}
for(i = 0; i < 2; i++ )
{
for(j = 2; j < 4; j++)
{
array[k] = matrix[i][j];
k++;
}
}
for(i = 2; i < 4; i++ )
{
for(j = 0; j < 2; j++)
{
array[k] = matrix[i][j];
k++;
}
}
for(i=2;i<4;i++)
{
for(j=2;j<4;j++)
{
array[k] = matrix[i][j];
k++;
}
}
正如你所看到的,我已经完成了4次加倍,但是,有没有动态的方法来做到这一点?如果我有一个更大的矩阵,如8 x 8,怎么做?如果更大则拆分与示例相同。
答案 0 :(得分:1)
您应该看到要复制的例程的模式。
除了 i 和 j 的开头和结尾不同之外,基本上你做同样的事情。因此,创建一个子例程并将它们作为参数传递。
例如:
void get_sub_matrix(int input[][N], int start_row, int end_row, int start_col, int end_col, int[] result, int* result_offset)
{
int offset = *result_offset;
for (int i = start_row; i < end_row; i++)
{
for (int j = start_col; j < end_col; j++)
{
result[offset++] = input[i][j];
}
}
*result_offset = offset;
}
注意在结果数组中添加更多元素时,结果偏移量如何在例程中增加。
现在你可以做到:
int matrix[N][N];
int array[N*N];
int k = 0;
get_sub_matrix(matrix, 0, 2, 0, 2, array, &k);
get_sub_matrix(matrix, 0, 2, 2, 4, array, &k);
get_sub_matrix(matrix, 2, 4, 0, 2, array, &k);
get_sub_matrix(matrix, 2, 4, 2, 4, array, &k);
P.S:Haven编译了它。