【问题标题】:Performing STL operations on Boost::uBLAS vectors对 Boost::uBLAS 向量执行 STL 操作
【发布时间】:2011-08-15 10:01:01
【问题描述】:

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

例如;我想采用 uBLAS 向量的所有元素的sin()。在 Boost、GSL 或任何其他数值库中是否有优化的方法来执行此操作,而不是简单地循环遍历向量的元素?

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

【问题讨论】:

标签: c++ boost gsl ublas


【解决方案1】:

您的向量(根据this)支持正常向量运算,只需使用标准算法即可。就你而言,这里有一些帮助(都在<algorithm> 内):

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

【讨论】:

    【解决方案2】:

    最接近地图的等价物是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 向量有 begin() 和 end() 或类似的)

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多