Я хочу нормализовать (масштабные значения между 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; }
}
Первое преобразование работает нормально, он вычитает минимальное значение из каждого вектора element.The проблема с второй, который должен разделить скорость с 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);
Любые идеи, как это решить? Или это возможно с одним преобразованием?
[станд :: преобразования] (http://en.cppreference.com/w/cpp/algorithm/transform) принимает либо 3, либо 4 итератора и функтор, во втором вызове вы даете ему 2 итератора 'double' и контейнер в качестве первых 4 аргументов ... – Borgleader
@ Я вижу сейчас, хорошо Я должен делить скорость на v1.Как должен выглядеть функтор? –
'normalized v (i) = v (i) -vmin/(vmax-vmin)' должно быть «нормализовано» v (i) = (v (i) -vmin)/(vmax-vmin) 'и делить ДЕЙСТВИТЕЛЬНО медленно , вам было бы намного лучше установить значение 'double scale = 1/(vmax-vmin)', а затем установить каждый 'v (i) = (v (i) -vmin) * scale' – RyanP