Есть ли способ изменить массив несколько раз в одной и той же позиции?
Когда я делаю это:
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;
}
Если есть какой-то лучший или официальный способ, дайте мне знать
Других решений пока нет …