如何将具有递减索引的方程式转换为具有求和的数学方程式?
How to turn equation with decrementing indexing into math equation with summation?
与这个问题类似: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;
}
}
如果问题只是在你向另一个方向循环时如何表达总和,你可以将代码更改为:
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];
}
}
我并不是说您必须将代码更改为此,但是从这里应该更清楚如何更改它以使用求和符号。
如果没有任何上下文很难判断,但如果您将数组视为以相反顺序(行优先)枚举元素的向量,则相关代码会变得更容易理解。下面的代码在功能上等同于发布的原始代码,但可以说更容易理解。
// 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
(另外,rela(k) == reha(k - 1) + 1
代表 k > 0
)。
从技术上讲,这个描述可以用二维数组翻译回来,但它很快就会变得相当混乱。
如果我没看错,你可以将效果转录为
您可以将其描述为矩阵 ela
是矩阵 ea
的 2D 后缀和 (对于每个元素,元素的总和按照字典顺序),而 eha
是矩阵 ela
和 ea
减去所有矩阵的总和。
与这个问题类似: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;
}
}
如果问题只是在你向另一个方向循环时如何表达总和,你可以将代码更改为:
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];
}
}
我并不是说您必须将代码更改为此,但是从这里应该更清楚如何更改它以使用求和符号。
如果没有任何上下文很难判断,但如果您将数组视为以相反顺序(行优先)枚举元素的向量,则相关代码会变得更容易理解。下面的代码在功能上等同于发布的原始代码,但可以说更容易理解。
// 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
(另外,rela(k) == reha(k - 1) + 1
代表 k > 0
)。
从技术上讲,这个描述可以用二维数组翻译回来,但它很快就会变得相当混乱。
如果我没看错,你可以将效果转录为
您可以将其描述为矩阵 ela
是矩阵 ea
的 2D 后缀和 (对于每个元素,元素的总和按照字典顺序),而 eha
是矩阵 ela
和 ea
减去所有矩阵的总和。