我得到了一组值,并根据使用掩码的那些值,我想计算每个值的导数。掩码如下:
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];
}
}
}
答案 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];
}
}