我想规范化(在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);
任何想法如何解决这个问题?或者单变换是否可能?
答案 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