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

时间:2016-07-06 19:16:49

标签: c++ algorithm math equation

类似于这个问题: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;                              
    }
}

3 个答案:

答案 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)

如果我是对的,你可以将效果转录为

enter image description here

您可以将此描述为矩阵ela是矩阵ea 2D后缀和(对于每个元素,词典排序后面的元素总和),eha是矩阵elaea减去所有矩阵的总和。

答案 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数组进行转换,但它会很快变得混乱。