C 关于二维矩阵的线性化问题

C 关于二维矩阵的线性化问题,c,C,所以我转换了一个2D矩阵: int m[10][10]; int i, j, tmp; main () { // inlezen van de matrix for (i=0; i<10; i++) for (j=0; j<10; j++) m[i][j] = getint(); intm[10][10]; int i,j,tmp; 主要() { //因莱森范德矩阵 对于(i=0;i,根据本书代码,索引如下: [k] [h] [99][0] [89][10] [79][20

所以我转换了一个2D矩阵:

int m[10][10];
int i, j, tmp;
main ()
{
 // inlezen van de matrix
 for (i=0; i<10; i++)
 for (j=0; j<10; j++)
 m[i][j] = getint();
intm[10][10];
int i,j,tmp;
主要()
{
//因莱森范德矩阵

对于(i=0;i,根据本书代码,索引如下:

[k] [h]
[99][0] [89][10] [79][20] [69][30] [59][40] [49][50] [39][60] [29][70] [19][80] [9][90] 
[98][1] [88][11] [78][21] [68][31] [58][41] [48][51] [38][61] [28][71] [18][81] [8][91] 
[97][2] [87][12] [77][22] [67][32] [57][42] [47][52] [37][62] [27][72] [17][82] [7][92] 
[96][3] [86][13] [76][23] [66][33] [56][43] [46][53] [36][63] [26][73] [16][83] [6][93] 
[95][4] [85][14] [75][24] [65][34] [55][44] [45][54] [35][64] [25][74] [15][84] [5][94] 
[94][5] [84][15] [74][25] [64][35] [54][45] [44][55] [34][65] [24][75] [14][85] [4][95] 
[93][6] [83][16] [73][26] [63][36] [53][46] [43][56] [33][66] [23][76] [13][86] [3][96] 
[92][7] [82][17] [72][27] [62][37] [52][47] [42][57] [32][67] [22][77] [12][87] [2][97] 
[91][8] [81][18] [71][28] [61][38] [51][48] [41][58] [31][68] [21][78] [11][88] [1][98] 
[90][9] [80][19] [70][29] [60][39] [50][49] [40][59] [30][69] [20][79] [10][89] [0][99] 

所以答案是肯定的。要减少循环次数,您可以尝试:

for (i=0; i<50; i++){
            k = 50 - i; 
            h = i + 50; 
            tmp = M[k];
            M[k] += M[h];
            if (i != 0) M[h] += tmp; //No not sum twice [50]

}
(i=0;i是的,你是对的

通过进行两次中间变换,可以更容易地看到:

从:

for (i=0; i<10; i++)
for (j=5; j<15; j++) {
  k = 10 * j + i - 50; 
  h = 149 - 10 * j - i;
  M[k] += M[h];
}

for(i=0;iIt不清楚你用一维数组表示什么。例如,这个赋值m[i][j-5]+=m[9-i][14-j];意味着什么。@Vlad来自莫斯科,它被评论为“执行复杂的数学运算”。我假设这只是一个随机操作,恰好添加了与另一个矩阵位置对称的矩阵位置。因此,例如位置[15]或[1][4]将添加[84]或[8][3],一维数组不使用内存布局有点令人困惑,其中对于
m[I][j]
,行索引是
i
,列索引是
j
,因此
k==10*i+j
@MOehm,有两种不同的布局。行线性化了,即k=10*i+j,但在本例中,我们使用了列线性化,它逐列导入,因此k=10*j+iYes,但C使用行主布局,所以这看起来很简单在我看来,这是一种更自然的教学方式。看到C代码以另一种方式进行教学是令人困惑的。老实说,我甚至没有想到解决这个方程,我只是随机选取了多个值,并意识到我的公式是等价的。感谢您的确认!
for (k = 0; k < 100; k++)
M[k] += M[99-k]
[k] [h]
[99][0] [89][10] [79][20] [69][30] [59][40] [49][50] [39][60] [29][70] [19][80] [9][90] 
[98][1] [88][11] [78][21] [68][31] [58][41] [48][51] [38][61] [28][71] [18][81] [8][91] 
[97][2] [87][12] [77][22] [67][32] [57][42] [47][52] [37][62] [27][72] [17][82] [7][92] 
[96][3] [86][13] [76][23] [66][33] [56][43] [46][53] [36][63] [26][73] [16][83] [6][93] 
[95][4] [85][14] [75][24] [65][34] [55][44] [45][54] [35][64] [25][74] [15][84] [5][94] 
[94][5] [84][15] [74][25] [64][35] [54][45] [44][55] [34][65] [24][75] [14][85] [4][95] 
[93][6] [83][16] [73][26] [63][36] [53][46] [43][56] [33][66] [23][76] [13][86] [3][96] 
[92][7] [82][17] [72][27] [62][37] [52][47] [42][57] [32][67] [22][77] [12][87] [2][97] 
[91][8] [81][18] [71][28] [61][38] [51][48] [41][58] [31][68] [21][78] [11][88] [1][98] 
[90][9] [80][19] [70][29] [60][39] [50][49] [40][59] [30][69] [20][79] [10][89] [0][99] 

for (i=0; i<50; i++){
            k = 50 - i; 
            h = i + 50; 
            tmp = M[k];
            M[k] += M[h];
            if (i != 0) M[h] += tmp; //No not sum twice [50]

}
for (i=0; i<10; i++)
for (j=5; j<15; j++) {
  k = 10 * j + i - 50; 
  h = 149 - 10 * j - i;
  M[k] += M[h];
}
for (i=0; i<10; i++)
for (j=0; j<10; j++) { //subtract 5 from j here
  k = 10 * j + i;      //so add 50 to compensate here
  h = 99 - 10 * j - i; //and subtract 50 to compensate here
  M[k] += M[h];
}
for (i=0; i<10; i++)
for (j=0; j<10; j++) { 
  k = 10 * j + i;      
  h = 99 - k;          //substitute 10j+i => k
  M[k] += M[h];
}
for (k=0; i<100; k++) { 
  M[k] += M[99-k];
}