使用 CPP 中的值和掩码计算导数
calculating derivative using values and mask in CPP
我得到了一组值,并且基于这些值使用掩码,我想计算每个值的导数。 其中掩码为:
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,依此类推。如果你使用外部为变量,那么它的值不会改变,它的值也可以超出范围。还有一件事要注意,你必须初始化数组的值,否则垃圾值就会在那里,你可能会看到令人惊讶的结果。
- 位移操作和位掩码未检测到重复字符
- OpenCV - 带有掩码的absdiff
- 生成前缀位掩码
- 如何从__m64值的 lsb 创建 8 位掩码?
- 如何对无符号长 int 进行位掩码?
- 删除K的背景掩码-意味着Python或C++中的集群/
- 如何在C++中优雅地处理位掩码
- 将uint64_t位掩码转换为 std::布尔数组
- 使输入二进制掩码适应 ITK 网格生成器
- 如何从 getifaddr 读取子网掩码
- 优化从子位掩码生成父位掩码
- 基于模式创建位掩码作为 constexpr
- 使用二进制掩码 C++ ITK 获取感兴趣区域
- C++中的运行时位复制(位掩码)
- 根据 IP 和掩码C++打印所有 IP
- C++设置"blank"或重置 ifstrean (ios) 的异常掩码
- 使用 CPP 中的值和掩码计算导数
- 使用掩码计算 uint512 的位
- 如何计算给定IPv4网络掩码的前缀长度
- 最好的方法来计算最大掩码的sse var