试图仅仅模拟Matlab" unique" c ++中的函数

时间:2014-04-13 20:20:19

标签: c++ matlab

我有以下向量,v = [ 9 2 9 5]和它的唯一元素c = [2 5 9]按升序排列。我希望提取向量u = [3 1 3 2]u向量包含向量c中唯一元素的索引,以便重构向量v

我的想法是迭代v并借助于基于c的唯一值构造的哈希表来获取索引值。这有意义吗?如果是的话,请问有人在c++提出建议吗?其他建议值得高度赞赏(我对高效实施感兴趣,因为vc矩阵足够大)。

祝你好运, 透特

1 个答案:

答案 0 :(得分:7)

C ++中的

索引从0开始。所以编写

会更正确

u = {2,0,2,1};

您可以使用标准算法来完成任务。例如(这里我假设矢量c已经以某种方式构建)

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{ 
   std::vector<int> v = { 9, 2, 9, 5 };
   std::vector<int> c = { 2, 5, 9 };

   std::vector<int> u;
   u.reserve( v.size() );

   std::transform( v.begin(), v.end(), std::back_inserter( u ),
                   [&]( int x )
                   {
                      return ( std::distance( c.begin(), 
                               std::lower_bound( c.begin(), c.end(), x ) ) );
                   } );

   for ( int x : u ) std::cout << x << ' ';
   std::cout << std::endl;
}

如果您需要从vector v获取唯一值,则可以使用std::set<int>代替std::vector<int>。例如

#include <iostream>
#include <vector>
#include <set>
#include <iterator>
#include <algorithm>

int main()
{ 
   std::vector<int> v = { 9, 2, 9, 5 };
   std::set<int> c( v.begin(), v.end() );

   std::vector<int> u;
   u.reserve( v.size() );

   std::transform( v.begin(), v.end(), std::back_inserter( u ),
                   [&]( int x )
                   {
                      return ( std::distance( c.begin(), c.find( x ) ) );
                   } );

   for ( int x : u ) std::cout << x << ' ';
   std::cout << std::endl;
}