Что я хочу сделать, так это: у меня есть «расширенный» массив в первом измерении (строки). Например, у меня есть изображение из 1080 строк и 1920 столбцов. Этот расширенный массив состоит из (8*1080) строк и 1920 столбцов, 8 означает размер «блока строк». Что я хочу сделать, так это создать новый массив размером 8x1. Этот новый массив будет содержать сумму каждого блока в i-м (i = от 0 до 7).
В приведенном выше примере первый элемент нового массива (i=0) будет суммой этих пикселей в расширенном массиве (линейные индексы по столбцам):
0, 8 (потому что 8 - ПЕРВЫЙ элемент второго блока), 16 (третий блок).....
другой пример - второй элемент:
1, 9, 17,...
Я думаю, это можно распараллелить? Я пытаюсь решить эту проблему, но не могу, я пробовал gfor, но не смог найти способ сделать это, разве это невозможно с помощью arrayfire? любая помощь приветствуется!
Я пробовал использовать gfor, но не смог решить проблему.
Вот код, который я пробовал: rx — это массив 8x1 (p_squared_1 = 8), а rx_all — расширенный (p_squared*rows, columns) массив. Примечание. Я использую оператор seq "+", потому что если я попытаюсь написать "i+p_squared_1", возникнет двусмысленность, я думаю... это ошибка с моей стороны, но я не смог найти другого способа добавить значение к объект последовательности).
af::array rx(p_squared_1, 1);
gfor(af::seq i, rows*cols*(p_squared_1-1)) {
rx(i) = af::sum<float>(rx_all(i.operator+( (const int)p_squared_1)));
}
af::eval(rx);
cout << af::sum<float>(rx);
Я ожидаю получить массив 8x1, где каждый i-й элемент является суммой i-го элемента каждого блока в расширенном массиве.