在Boost :: uBLAS向量上执行STL操作

时间:2011-08-15 10:01:01

标签: c++ boost gsl ublas

如何将函数映射到uBLAS中矢量的每个元素(如Mathematica中的Map [])?

例如;我想取一个uBLAS向量的所有元素的sin()。在Boost,GSL或任何其他数值库中是否有一种优化的方法可以做到这一点,而不是简单地循环遍历向量的元素?

另外,我如何对uBLAS向量执行其他高级操作,例如旋转,删除重复项或用零填充等等?

2 个答案:

答案 0 :(得分:1)

与地图最接近的是std::transform

#include <algorithm>
#include <functional>
#include <vector>
#include <cmath>

int main() {
   std::vector<float> values;
   values.push_back(0.5f);
   values.push_back(1.0f);
   std::transform(values.begin(), values.end(), values.begin(), std::ptr_fun(sinf));
}

对于重复数据删除:

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

int main() {
   std::vector<int> duplicates;
   duplicates.push_back(1);
   duplicates.push_back(3);
   duplicates.push_back(5);
   duplicates.push_back(1);
   std::sort(duplicates.begin(), duplicates.end());
   duplicates.erase(std::unique(duplicates.begin(), duplicates.end()), duplicates.end());
   std::copy(duplicates.begin(), duplicates.end(), std::ostream_iterator<int>(std::cout, "\n"));
}

(我相信ublas vector有begin()end()或类似的)

答案 1 :(得分:1)

您的矢量(根据this)支持常规矢量操作,只需使用标准算法。在您的情况下,这里有一些帮助(全部在<algorithm>内):

  • 对于正弦操作,请使用来自std::transform
  • sinef <cmath>
  • 对于旋转,(我假设向量旋转,而不是角度旋转)std::rotate
  • 删除重复项,排序后使用std::unique,删除未使用的元素。
  • 使用零填充更多是输出操作 - 您不在矢量上执行