在Matlab中,[C, ia, ic] = unique(A)
函数返回一个排序数组C
,其中删除了A
中的重复项,并且ia
和ic
数组包含索引,使得C = A(ia) and A = C(ic)
。例如:
A = [1, 2, 3, -1, -2, 0, 0, 0, 4];
[C, ia, ic] = unique(A);
C = [-2, -1, 0, 1, 2, 3, 4];
% The indices are incremented by 1 to accomodate the C++ convection.
ia = [4, 3, 7, 0, 1, 2, 8]; % size(ia) = size(C)
ic = [3, 4, 5, 1, 0, 2, 2, 2, 6]; % size(ic) = size(A)
这是我的实现:
std::vector<int> A = {1, 2, 3, -1, -2, 0, 0, 0, 4};
std::set<int> C(A.begin(), A.end());
std::vector<int> ic;
ic.reserve(A.size());
std::transform(A.begin(), A.end(), std::back_inserter(ic),
[&](int x) { return (std::distance(C.begin(), C.find(x))); });
我现在可以正确地获得数组C和ic,但我不知道如何获得数组ia。
有人能帮我吗?
答案与计算ic
的方法非常相似。只需在transform
调用中交换A
和C
:
std::vector<int> ia;
ia.reserve(C.size());
std::transform(C.begin(), C.end(),
std::back_inserter(ia),
[&](int x) { return std::distance(A.begin(),
std::find(A.begin(), A.end(), x));
});
您还需要使用std::find
,因为std::vector
不提供.find()
成员函数。
另一种与Matlab语法相似的方法:
#include <algorithm>
#include <vector>
std::vector<int> A = {1, 2, 3, -1, -2, 0, 0, 0, 4};
std::vector<int> B (A.begin(), A.end());
std::sort(B.begin(), B.end());
auto last = std::unique(B.begin(), B.end());
B.erase(last, B.end());
编译器资源管理器链接
如果要查找条目位置的索引,可以使用find_first_of
。