如何在ArrayFire数组的重复索引位置多次修改元素?
解决ArrayFire重复索引累加修改的问题
这个问题确实是ArrayFire中索引赋值的常见行为——当你用重复索引执行+=这类操作时,它只会对每个唯一索引应用一次修改,而不会累加重复的操作。不过我们可以通过统计索引出现的频次来实现你想要的累加效果,下面是具体的实现思路和代码:
核心思路
你希望每个索引被访问几次,就对该位置执行几次加法,所以我们可以先统计每个索引在索引数组中出现的次数,然后直接将这个频次数组加到原数组上,这样每个位置的增量就是它被索引的次数。
实现代码
#include <arrayfire.h> #include <iostream> using namespace af; int main() { float a[] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6 }; array A(6, a, afHost); af_print(A); float i[] = { 0, 1, 2, 2}; array I(4, i, afHost); // 步骤1:统计每个索引的出现次数 // 生成覆盖原数组所有索引的bins(这里是0到5) array bins = seq(0, A.elements() - 1); // 计算每个索引的出现频次 array counts = histogram(I, bins); // 步骤2:将频次转换为和原数组匹配的类型,然后累加 A += counts.as(f32); af_print(A); return 0; }
代码解释
histogram(I, bins):这个函数会统计索引数组I中每个值在bins范围内的出现次数,返回的counts数组长度和原数组A一致,每个元素对应该索引被访问的次数(比如这里counts的结果是[1,1,2,0,0,0])。counts.as(f32):因为histogram默认返回整数类型的数组,我们需要将其转换为和A一致的float类型,才能顺利执行加法操作。
运行这段代码后,你会得到预期的结果:A的第三个元素(索引2)会被累加2次,最终值为2.3。
内容的提问来源于stack exchange,提问作者Imma
相关产品推荐
相关产品推荐

