使用 CPP 中的值和掩码计算导数

calculating derivative using values and mask in CPP

本文关键字:掩码 计算 CPP 使用      更新时间:2023-10-16

我得到了一组值,并且基于这些值使用掩码,我想计算每个值的导数。 其中掩码为:

mask[9] = {-d,-c,-b,-a,0,a,b,c,d};

值为 as(当然掩码中有数字而不是字母,但为了更容易理解概念本身):

pointX[128] = {0,1,2,3,4,5,6,7,8,9...}

因此,例如deriv_pointX = 4的导数应计算为:

0*(-d)+1*(-c)+2*(-b)+3*(-a)+4*0+5*a+6*b+7*c+8*d

(编辑:我可能还不够清楚,公式是,选择要计算导数的点X,并从该点开始按"0"多重播放它,从它的左边取4个neibour数,从右边取4个neibour数,然后将它们与来自mask[]的"0"的相应neibour数相乘,所有这些都加在一起得到pointX的结果。所以选择的点X总是乘以"0")

例2:deriv_pointX[5] = 1*(-d)+2*(-c)+3*(-b)+4*(-a)+5*0+6*a+7*b+8*c+9*d

我当前的代码不起作用:

void calculate_deriv(int pointX[128], int mask[9])
{
    int deriv_pointX[128];
    for(int i=4; i<128; i++)
    {
        for(int j=0; j<8; j++)
        {
            deriv_pointX[i]=pointX[i]*mask[j];
        }
    }
}

首先,您省略了前 4 个点,因为您无法计算它们。这很好,但你忘了忽略最后 4 个点(你也无法计算它们)。

你也忘了反映在用于计算deriv_pointX[i]的公式中,总和中的第一个元素是 pointX[i-4]*mask[0] ,然后是 pointX[i-3]*mask[1],依此类推......也看到这一点,只需在前面的公式中让 i = 4,您将看到示例的第一个项。

你的 for 循环将变成这样:

for (int i=4; i < 124; ++i) {
    deriv_pointX[i] = 0; // Just to assert that we start our sum from 0
    for (int j=0; j < 8; ++j) {
        deriv_pointX[i] += pointX[i-4+j]*mask[j];
    }
}

代码中的行替换为以下内容:

deriv_pointX[i]+=pointX[j]*mask[j];

你所做的是每次都覆盖乘法的值。你必须做所有乘法的加法。我使用了速记符号 a+=b,意思是 a=a+b。此外,您还必须使用 pointX 获取内部变量,因为您想要 0 然后是 1 和 2,依此类推。如果你使用外部为变量,那么它的值不会改变,它的值也可以超出范围。还有一件事要注意,你必须初始化数组的值,否则垃圾值就会在那里,你可能会看到令人惊讶的结果。