矩阵指针指向C中的子矩阵

时间:2016-11-15 15:40:30

标签: c matrix

我在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,怎么做?如果更大则拆分与示例相同。

1 个答案:

答案 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编译了它。