Есть нормирующая функция :
| Код | std::vector<double> & norm_vec(std::vector<double> &vec) { auto max_abs = std::max_element(vec.begin(),vec.end(), [](double & d1,double & d2) {return ::fabs(d1) < ::fabs(d2) ;});
double scale = ::fabs((*max_abs));//Непонятно зачем, но без этого не работает.
std::transform(vec.begin(),vec.end(),vec.begin(), [&](double & v){return v/scale;});
return vec; }
std::vector<double> & norm2_vec(std::vector<double> &vec) { auto max_abs = std::max_element(vec.begin(),vec.end(), [](double & d1,double & d2) {return ::fabs(d1) < ::fabs(d2) ;});
//double scale = ::fabs((*max_abs));//Непонятно зачем, но без этого не работает.
std::transform(vec.begin(),vec.end(),vec.begin(), [&](double & v){return v/::fabs((*max_abs));});
return vec; }
|
По каким-то, неизвесным мне, причинам вариант 1 рабочий, а вариант 2 перестает нормировать после максимального значения. Собственно вопрос: кто ошибся, я или компилятор ?
http://liveworkspace.org/code/4a1f72815ef7338c9bc3d8a144f08846
|