首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于二维矩阵线性化的问题

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

Stack Overflow用户
提问于 2019-10-31 09:12:30
回答 2查看 386关注 0票数 0

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

代码语言:javascript
复制
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();

到1D:

代码语言:javascript
复制
int M[10*10];
int i, j, tmp;
int k, h;
main ()
{
 // inlezen van de matrix
 for (i=0; i<10; i++)
 for (j=0; j<10; j++) {
 k = 10 * j + i;
 M[k] = getint();
 }

最后,我们必须转换这段代码,这样它才能为我们的1D数组提供功能:

代码语言:javascript
复制
// voer complexe bewerking uit op de matrix
 for (i=0; i<10; i++)
 for (j=5; j<15; j++)
 m[i][j-5] += m[9-i][14-j];
 ... // Druk de matrix af
}

这本书是这样写的:

代码语言:javascript
复制
 for (i=0; i<10; i++)
 for (j=5; j<15; j++) {
 k = 10 * j + i - 50; // 10*(j-5) + i = 10*j + i - 50
 h = 149 - 10 * j - i // 10*(14-j) + (9-i) =
 // 140 - 10*j + 9 - i = 149 - 10*j - i
 M[k] += M[h];
 }

不过,我的解决办法是,

代码语言:javascript
复制
for (k = 0; k < 100; k++)
M[k] += M[99-k]

我想知道我的解决方案是否也是正确的,因为上面所有的代码都是添加对称元素。所以可以用我的公式来简化,对吧?

提前感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-31 09:58:45

根据这本书的代码,索引如下:

代码语言:javascript
复制
[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] 

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

代码语言:javascript
复制
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]

}
票数 0
EN

Stack Overflow用户

发布于 2019-10-31 10:02:48

是的,你是对的。

通过几个中间转换可以更简单地看到:

从以下方面开始:

代码语言:javascript
复制
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];
}

更改为更常见的j值范围使其更简单:

代码语言:javascript
复制
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];
}

然后再使用k:

代码语言:javascript
复制
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];
}

那么很简单就可以看出这相当于

代码语言:javascript
复制
for (k=0; i<100; k++) { 
  M[k] += M[99-k];
}

当然,你已经知道这一点,但也许上面的情况更清楚地证明了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58639995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档