执行矢量运算

时间:2010-07-19 11:13:59

标签: c++ vector

我正在使用向量容器来存储双精度数组。有没有快速 不使用循环将我的向量中的每个元素乘以某个标量的方法。

例如:

  vector<double> Array(10,1);

将初始化10个双精度数组,初始值为1.乘以此值 数组由0.5我会写:

  for(unsigned int i=0; i<Array.size(); i++) 
     Array[i] = 0.5*Array[i]; 

还有另外一种方法吗?我使用了重载'*'运算符的valarray 这样:

     Array = 0.5 * Array; 

是有效的,但我宁愿不使用valarray,因为它似乎是一个更多的向量容器 操作数组的标准方法。

谢谢!

5 个答案:

答案 0 :(得分:10)

你可以这样做:

std::transform(Array.begin(), Array.end(), Array.begin(),
                std::bind2nd(std::multiplies<double>(), 0.5));

回应获得元素总和:

double sum = std::accumulate(Array.begin(), Array.end(), 0.0);

为了回应每个元素的sqrt

std::transform(Array.begin(), Array.end(), Array.begin(),
                static_cast<double (*)(double)>(std::sqrt));

该演员表是选择正确的过载。

答案 1 :(得分:1)

您可以使用std :: transform:

 std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5)));

答案 2 :(得分:1)

STL向量本身不允许在单个操作中进行元素缩放。

您可以使用应用缩放因子的装饰器包装矢量。无论向量的大小如何,新因子的应用都是O(1)。这不是免费的,因为缺点是复杂性增加,每个元素的访问量更大。

答案 3 :(得分:1)

考虑使用std::valarray,因为它是更合适的选择。

标准库提供各种容器是有原因的。它允许开发人员使用“马匹作为课程”。

std::vector是最简单的容器,因此对于许多情况来说是最佳选择。但是,对于特定情况,另一种容器类型的附加功能可能使该类型成为更好的选择。这可能是一种这样的情况,其中数组成员的数值操作由std::valarray更好地处理。

答案 4 :(得分:0)

据我所知,没有。

如果有的话,可能会为你封装这个循环。所以我不认为表现会改变。