根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序



我有一个模板化向量vclass T(floatdouble(,包含N*D(=npoints*ndims(元素。 例如,对于 D=2,v将包含[ p0[0], p0[1], p1[0], p1[1], p2[0], p2[1], ... pN-1[0], pN-1[1] ]

我想得到一个N索引的向量lsort,这些索引对应于对点进行升序排序,首先根据坐标 0,然后根据坐标 1。 没有重合点。

例如,如果点 (p0...pN-1( 是 ((0,0(, (0,1(, (1,2(, (1,0((,我的意思是:

v = [ 0, 0, 0, 1, 1, 2, 1, 0 ]
lsort = [ 0, 1, 3, 2 ]

由于 P3 的坐标 0 与 P2 相同,但坐标 1 较低。

我不在乎获得排序向量(一旦我有lsort,我就可以这样做(。

我之前与自定义运算符进行了比较,但我没有弄清楚比较如何跳过所有其他元素。

首先生成浮点指针(或迭代器(的向量容器,其中元素指向每个D元素,即每个空间向量的第一维。

然后使用自定义比较函数std::sort指针向量,该函数对left[0], right[0]进行字典比较,然后left[1], right[1]直到最终left[D-1], right[D-1]是否所有先前的比较都相同。

现在,您有一个指向每个空间向量的指针的向量容器,按所需的排序进行排序。如果要获取这些空间向量的索引,只需从指针向量的每个元素中减去指向v第一个元素的指针。这将是v内的索引。除以D以获得与示例输出匹配的索引。

或者,您可以从使用std::iota生成的从 0 到D-1的索引序列开始,并使用更复杂的比较函数,该函数执行从索引到坐标的转换。

最新更新