在具有重复索引的索引数组处更改 ArrayFire 数组



有没有办法在同一位置多次更改数组?
当我这样做时:

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);
A(I) += 1;
af_print(A);

结果将是

A
[6 1 1 1]
1.1000
1.2000
1.3000
0.4000
0.5000
0.6000

而不是

A
[6 1 1 1]
1.1000
1.2000
2.3000    // <--
0.4000
0.5000
0.6000

我了解问题是什么,但必须采取某种解决方法,例如首先计算索引出现次数。

好的,几个小时后解决了。
此函数将数组拆分为仅具有唯一值的数组:

vector<af::array> AFSeperateToUniqueIdxBufs(const af::array& a)
{
    int count = a.elements();
    af::array aSorted;
    af::array origIdxs = af::seq(count);
    af::sort(aSorted, origIdxs, a, 0, true);
    vector<af::array> v;
    for (int i = 0; i < 10; i++)
    {
        if (count > 1)
        {
            const af::array& aSortedNext = af::join(0, aSorted(af::seq(1, count - 1)), (af::constant(-1, 1)));
            const af::array& unique = aSorted != aSortedNext;
            const af::array& uniqueIdxs = af::where(unique);
            v.push_back(origIdxs(uniqueIdxs));
            const af::array& restIdxs = af::where(!unique);
            count = restIdxs.elements();
            aSorted = aSorted(restIdxs);
            origIdxs = origIdxs(restIdxs);
        }
        else
        {
            v.push_back(origIdxs);
            break;
        }
    }
    return v;
}

之后,我循环遍历数组并逐步更改原始数组。

for (int i = 0; i < v.size(); i++)
{
    const af::array& uniqueIdxs = I(v[i]);
    A(uniqueIdxs) += 1;
}

如果有更好或官方的方式,请告诉我

相关内容

  • 没有找到相关文章

最新更新