如何将具有递减索引的方程式转换为具有求和的数学方程式?

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-1reha(k)rea 个元素的部分和少一个0 ... k(另外,rela(k) == reha(k - 1) + 1 代表 k > 0)。

从技术上讲,这个描述可以用二维数组翻译回来,但它很快就会变得相当混乱。

如果我没看错,你可以将效果转录为

您可以将其描述为矩阵 ela 是矩阵 ea2D 后缀和 (对于每个元素,元素的总和按照字典顺序),而 eha 是矩阵 elaea 减去所有矩阵的总和。