使用重复索引更改Index Array处的ArrayFire数组

时间:2018-01-06 14:17:20

标签: c++ vectorization 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

我理解问题是什么,但必须有一些工作,比如首先计算索引出现次数。

1 个答案:

答案 0 :(得分:1)

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

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;
}

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