Изменить массив ArrayFire на Index Array с повторяющимися индексами

Есть ли способ изменить массив несколько раз в одной и той же позиции?
Когда я делаю это:

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

Решение

Ладно, решил через пару часов.
эта функция разбивает массив на массивы только с уникальными значениями:

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

Если есть какой-то лучший или официальный способ, дайте мне знать

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector