类似于这个问题:Turn while loop into math equation?,我有以下嵌套循环,我试图将其转换为数学方程式,因为我需要以一种看起来不像代码的格式来编写它。我相信我需要某种类型的求和方程式。
以下是代码:
int num = 0;
for (int i = nr - 1; i >= 0; i--) {
for (int j = nc - 1; j >= 0; j--) {
ela[i][j] = num;
eha[i][j] = num + ea[i][j] - 1;
num += ea[i][j];
}
}
我知道摘要从下限开始并继续上限,因此我不太确定如何在此处应用求和,因为我从较高的索引开始并继续使用较低的索引。
我不确定为什么我会被投票,因为我引用的问题与我的非常相似,标签相同并被投票14次。如果我能以某种方式改进我的问题,请在下面评论。
更新
我能够按如下方式更新公式:
nr = 50;
nc = 10;
num = sum[ea[i,j],i=0,nr-1,j=0,nc-1]; // correct based upon nr, nc and ea
for (int i = 0; i < nr; i) {
for (int j = 0; j < nc; j++) {
num = num - ea[i,j];
ela[i][j] = num;
eha[i][j] = num + ea[i,j] - 1;
}
}
答案 0 :(得分:1)
如果问题在于如何在循环另一个方向时表达总和,则可以将代码更改为:
int num = 0;
for (int i = 0; i < nr; i++) {
for (int j = 0; j < nc; j++) {
ela[nr - i][nc - j] = num;
eha[nr - i][nc - i] = num + ea[nr - i][nc - j] - 1;
num += ea[nr - i][nc - j];
}
}
我并不是说您必须将代码更改为此,但是从这里开始,如何更改此代码以使用求和符号应该更加明显。
答案 1 :(得分:1)
答案 2 :(得分:-1)
在没有任何上下文的情况下很难分辨,但如果您将数组视为以相反顺序枚举元素的行向量,则有问题的代码变得更容易理解。下面的代码在功能上等同于发布的原始代码,但可以说更容易理解。
// n.b. ela[nr - 1 - i][nc - 1 - j] == rela(nc * i + j);
int &rela(int k) { return ela[nr - 1 - k / nc][nc - 1 - k % nc]; }
int &reha(int k) { return elh[nr - 1 - k / nc][nc - 1 - k % nc]; }
int &rea(int k) { return ea[nr - 1 - k / nc][nc - 1 - k % nc]; }
for (int k = 0, sum = 0; k < nr * nc - 1; k++) {
rela(k) = sum;
sum += rea(k);
reha(k) = sum - 1;
}
简单来说,rela(k)
是rea
元素0 ... k-1
的部分和,而reha(k)
比rea
元素0 ... k
的部分和少一个1}}(另外,rela(k) == reha(k - 1) + 1
代表k > 0
)。
从技术上讲,这个描述可以根据2d数组进行转换,但它会很快变得混乱。