Просто чтобы добавить ко всему этому что-то очень мало, а остальные, скорее всего, не знали.
Если вы работаете с изображениями, вы можете предпочесть не используйте предубеждение вообще. В теории, таким образом, ваша сеть будет более независимой от величины данных, как в том, является ли изображение темным, ярким и ярким. И сеть собирается научиться выполнять эту работу путем изучения относительности внутри ваших данных. Многие современные нейронные сети используют это.
Для других данных, имеющих предубеждения, может быть критическим. Это зависит от того, с какими данными вы имеете дело. Если ваша информация является величиной-инвариантной --- если ввод [1,0,0.1] должен привести к такому же результату, как если бы вы ввели [100,0,10], вам может быть лучше без смещения.
Да, lower_bound может использоваться для этого, я видел его прежде и использовал его как этот.
map_type::iterator it = map.lower_bound(2.3);
if(it != map.begin()) {
--it;
// it now points at the right element
}
на самом деле возвратил бы самое большое, еще меньшее (если это! = map.begin () было верно), один. Если это было в .begin, то нет никакого меньшего ключа. Хорошая идея из комментариев состоит в том, чтобы возвратиться .end
, если нет никакого элемента, который это меньше, и упакуйте этот материал в функцию:
template<typename Map> typename Map::const_iterator
greatest_less(Map const& m, typename Map::key_type const& k) {
typename Map::const_iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
template<typename Map> typename Map::iterator
greatest_less(Map & m, typename Map::key_type const& k) {
typename Map::iterator it = m.lower_bound(k);
if(it != m.begin()) {
return --it;
}
return m.end();
}
шаблон должен работать на std::set
также.
Если Вы не заботитесь об упорядочивании, можно использовать карту:: upper_bound для получения элемента, который Вы хотите, но необходимо определить класс сопоставления со станд.:: больше для аргумента черт, так, чтобы упорядочивание было высоко-к-низкому.
typedef std::map<double,MyClass,std::greater<double> > MyMap;
MyMap myMap;
myMap[1.5] = value1;
myMap[2.0] = value2;
myMap[3.0] = value3;
MyMap::iterator elt = myMap.upper_bound(2.5); // should be pair(2.0,value2)
Ваш метод будет работать, но необходимо проверить, чтобы удостовериться, что Вы не отступаете за начало карты. Плюс Вы нужен lower_bound, не upper_bound.
iterator = map.lower_bound(2.3)
if (iterator != map.begin())
--iterator;
Я использовал бы станд.:: find_if () с обратными итераторами, чем-то как:
find_if( map.rbegin(), map.rend(), is_less_than );
необходимо будет определить is_less_than () функция предиката.
(cf. http://www.cplusplus.com/reference/algorithm/find_if.html )