2016-11-15 121 views
0

我有这样的矩阵中C.矩阵指针到子矩阵用C

[1,2,3,4] 
[5,6,7,8] 
[9,10,11,12] 
[13,14,15,16] 

N×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倍,但是,有没有动态的ic方式做到这一点?如果我有一个更大的矩阵,如8 x 8,该怎么做?如果更大,则拆分与示例相同。

+1

你是什么意思分裂是一样的?它是分解成相同数量的子矩阵,还是子矩阵大小保持不变? –

+0

观察循环变量'i'和'j'的初始值和结束值的规律性。给定原始矩阵的大小和子矩阵的大小,规则是什么?如果你发现它们,应该很容易有一个外部循环或者两个嵌套的循环(而不是写入基本上相同的双循环四次或N!次),并计算正确的索引开始和结束值。编程是关于规则,避免代码重复。 –

+0

@DrewMcGowen是的,如果一个矩阵是8x8,我会得到16个子矩阵2x2 – chantaman1

回答

1

你应该看到你正在复制的例程模式。

基本上你做同样的事情,不同的是Ĵ开始和结束是不同的。因此创建一个子例程并将它们作为参数传递。

例如:

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:有没有编译它。

+0

完美工作。一些调整,现在是完全动态的。谢谢! – chantaman1