如何将矢量除以?

时间:2015-08-21 13:26:13

标签: c++ vector

我想规范化(在0和1之间缩放值)矢量速度。

normalized v(i)=v(i)-vmin/(vmax-vmin)

我的代码

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

using namespace std;

int main(){
vector<double> velocity;
vector<double> results;
double vLower, vUpper, v1;

ifstream inputFile1("/home/milenko/gust/vel.dat");

if (inputFile1) {        
    double value;

    while ( inputFile1 >> value ) {
        velocity.push_back(value);
    }
}

vLower = *min_element(velocity.begin(), velocity.end());
vUpper = *max_element(velocity.begin(), velocity.end());

v1 = vUpper-vLower;
transform(velocity.begin(), velocity.end(), velocity.begin(), [vLower](double i) -> double { return i - vLower; });
transform (velocity.begin(), velocity.end(), v1, results, divides<double>());
for (auto c : results) { std::cout << c << std::endl; }
}

第一个变换工作正常,它从每个向量元素中减去最小值。问题在于第二个,它应该用v1来划分速度。

 In instantiation of ‘_OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation) [with _IIter1 = __gnu_cxx::__normal_iterator<double*, std::vector<double> >; _IIter2 = double; _OIter = std::vector<double>; _BinaryOperation = std::divides<double>]’:
v1.cpp:29:76:   required from here
/usr/include/c++/4.8/bits/stl_algo.h:4964:59: error: no match for ‘operator++’ (operand type is ‘std::vector<double>’)
       for (; __first1 != __last1; ++__first1, ++__first2, ++__result)
                                                           ^
/usr/include/c++/4.8/bits/stl_algo.h:4965:37: error: invalid type argument of unary ‘*’ (have ‘double’)
  *__result = __binary_op(*__first1, *__first2);
                                     ^
/usr/include/c++/4.8/bits/stl_algo.h:4965:2: error: no match for ‘operator*’ (operand type is ‘std::vector<double>’)
  *__result = __binary_op(*__first1, *__first2);

任何想法如何解决这个问题?或者单变换是否可能?

2 个答案:

答案 0 :(得分:8)

v1不应该在transform来电。

transform (velocity.begin(), velocity.end(), back_inserter(results), 
bind(divides<double>(), placeholders::_1, v1));

但是因为你在第一次变换中使用lambda,所以在第二次变换中使用lambda也会更简单。

transform (velocity.begin(), velocity.end(), back_inserter(results),
[&v1](double v) { return v / v1; });

答案 1 :(得分:2)

首先,您可以使用标准算法textarea来查找遍历向量的最小值和最大值。

其次有时候编写基于范围的for循环比使用带有lambda表达式的算法更好,因为在第一种情况下代码更具可读性。

所以你可以写

page1.html

如果您需要创建一个新的矢量,那么您可以编写insted

std::minmax_element