使用CPP

时间:2016-06-03 10:33:49

标签: c++

我得到了一组值,并根据使用掩码的那些值,我想计算每个值的导数。掩码如下:

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

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

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数字来自“0”,所有这些都加在一起得到pointX的结果。所以选择pointX总是乘以“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];
        }
    }
}

2 个答案:

答案 0 :(得分:0)

用以下代码替换你的代码:

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

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

答案 1 :(得分:0)

首先,您省略了前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];
    }
}