从最小/最大数据点检索多个 ArrayFire 子阵列

Retrieve multiple ArrayFire subarrays from min/max data points

提问人:AAG 提问时间:4/6/2022 更新时间:5/16/2022 访问量:89

问:

我有一个数组,其中包含触摸值的部分。例如:

0 0 1 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 2 2 0 0
0 0 0 0 0 0 0 2 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 0

由此,我创建了一组 af::arrays:minX、maxX、minY、maxY。它们定义了包含每个组的框。 所以对于这个例子:

minX would be: [1,5,2] // 1 for label(1), 5 for label(2) and 2 for label(3)
maxX would be: [3,7,2] // 3 for label(1), 7 for label(2) and 2 for label(3)
minY would be: [0,3,7] // 0 for label(1), 3 for label(2) and 7 for label(3)
maxY would be: [1,4,9] // 1 for label(1), 4 for label(2) and 9 for label(3)

因此,如果你从每个数组中获取第 i 个元素,你可以得到一个包含相应标签的框的左上/右下边界。

我想使用这些值从这个更大的数组中提取子数组。我的目标是将这些值包含在框中,并放入一个平面列表中。在 GPU 内存中,我还使用 max/min X/Y 值计算了每个框需要多少个条目。因此,在此示例中,平面列表的结果应为:

结果=[0 1 0 1 1 1 2 2 2 0 0 2 3 3 3]

其中前 6 个条目来自框

 ______
|0 1 0 |
|1 1 1 |
 ------

后 6 个条目来自盒子

 ______
|2 2 2 |
|0 0 2 |
 ------

最后三个条目来自盒子

 ___
| 3 |
| 3 |
| 3 |
 ---

我无法弄清楚如何在驻留在 GPU 上的内存中使用最小/最大值索引到这个 af::array(并且不想将它们传输到 CPU)。我试图看看 gfor/seq 是否适合我,但似乎 af::seq 不能使用数组数据,而且我尝试使用 af::index 的所有东西我也无法为我工作。

我能够更改表示最小值/最大值的方式(我可以存储左上角/右下角的索引),但我的主要目标是在 GPU 上有效地执行此操作,而无需在 GPU 和 CPU 之间来回移动数据。

如何使用ArrayFire有效地实现这一目标?

谢谢你的帮助

C++ 子数组 ArrayFire

评论


答:

0赞 Damien LEFEVRE 5/16/2022 #1

到目前为止,你是怎么做到的?你用的是哪种语言?

我想您可以将结果平铺到 3 维以分别处理每个区域,并最终在 GPU 内存中获得最小/最大向量。