有没有办法在同一位置多次更改数组?
当我这样做时:
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;
}
如果有更好或官方的方式,请告诉我