Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2017, 16:39   #1
Quantum1
Новичок
Джуниор
 
Регистрация: 19.02.2017
Сообщений: 3
По умолчанию Не понимаю std :: accumulate

Добрый день! Начинаю потихоньку разбираться с нейросетями...
Раньше на С писал только хардовый софт, по этому имею проблемы с С++)))

разбираю в этой статье

https://software.intel.com/ru-ru/blo...2/finereader-2

листинг
Код:

	link_koefs LearnNeuroNet(const list &src_images) {
	    link_koefs result_koefs;
	    size_t neurons_count = src_images.front().size();
	    result_koefs.resize(neurons_count);
	 
	    for (size_t i = 0; i < neurons_count; ++i) {
	 
	        result_koefs[i].resize(neurons_count, 0);
	 
	    }
	    for (size_t i = 0; i < neurons_count; ++i) {
	 
	        for (size_t j = 0; j < i ; ++j ) {
	 
	            koef_t val = 0;
	 
	            val = std::accumulate(begin(src_images), end(src_images), koef_t(0.0), [i, j] (koef_t old_val, const neurons_line &image) -> koef_t{
	 
	                return old_val + (image[i] * image[j]);
	            }); 
	            result_koefs[i][j] = val;
	 
	            result_koefs[j][i] = val;
	 
	        }
	 
	    }
	 
	 
	 
	    return result_koefs;
	 
	}


и никак не догоняю тонкости работы этой строчки*)) вроде понимаю что она должна делать, но пошагово разложить ее не могу... Более менее подробного разбора этих std::xxx что бы стало все понятно, найти не удалось

можете пожалуйста подробно объяснить что пошагово происходит в этом месте.
Спасибо!
Quantum1 вне форума Ответить с цитированием
Старый 19.02.2017, 16:51   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Как это не нашли? Полно документации и примеров же.
http://en.cppreference.com/w/cpp/algorithm/accumulate

Первые 2 параметра (как и в большинстве функций из <algorithm> и т.п.) это итераторы на начало и конец коллекции.
3 параметр — начальное значение "аккумулятора".
4 — функция, которой передают текущее значение аккумулятора и значение элемента коллекции, и она возвращает новое значение аккумулятора.

То есть реализация accumulate выглядит примерно так:
Код:
T accumulate(begin, end, acc, func) {
    Для каждого элемента el от begin до end {
        acc = func(acc, el);
    }
    return acc;
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.02.2017 в 16:56.
Alex11223 вне форума Ответить с цитированием
Старый 19.02.2017, 17:12   #3
Quantum1
Новичок
Джуниор
 
Регистрация: 19.02.2017
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Как это не нашли? Полно документации и примеров же.
http://en.cppreference.com/w/cpp/algorithm/accumulate

Первые 2 параметры (как и в большинстве функций из <algorithm> и т.п.) это итераторы на начало и конец коллекции.
3 параметр — начальное значение "аккумулятора".
4 — функция, которой передают текущее значение аккумулятора и значение элемента коллекции, она возвращает новое значение аккумулятора.

То есть реализация accumulate выглядит примерно так:
Код:
T accumulate(begin, end, acc, func) {
    Для каждого элемента el от begin до end {
        acc = func(acc, el);
    }
    return acc;
}
ссылку эту читал в первую очередь, но не понял как применить ее к примеру*)))
В общих чертах - то что вы объяснили, я понял*)

не пинайте плз за идиотские вопросы.
ок! спрошу что подробнее

в первой функции передается const list &src_images, что это? ссылка на массив? но это ж типа обучающая выборка, т.е. должны быть бинарные картинки. Короче вероятно это ссылка на массив с векторами(вектор = картинка)

std::accumulate(
begin(src_images), // тогда это начальный элемент массива? его номер? значение?
end(src_images), // последний элемент массива? его номер? значение?
koef_t(0.0), // коэффициент тут вроде ясно
[i, j] (koef_t old_val, const neurons_line &image) -> koef_t{ return old_val + (image[i] * image[j]); //тут я если честно вообще нихрена не понимаю*)) откуда берется начальное old_val(или оно 0 по дефолту)? откуда формируется image?


вы говорите коллекция. А что это конкретно? Массив, вектор?
image[i] и image[j] это элементы массива/вектора?

Последний раз редактировалось Quantum1; 19.02.2017 в 17:22.
Quantum1 вне форума Ответить с цитированием
Старый 19.02.2017, 18:51   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Quantum1 Посмотреть сообщение
тогда это начальный элемент массива? его номер? значение?
Итератор. Что-то типа указателя. Подробнее читать в каком-нибудь учебнике или документации по STL.

Цитата:
Сообщение от Quantum1 Посмотреть сообщение
вы говорите коллекция. А что это конкретно? Массив, вектор?
Да, в том числе и это, как и много чего другого.


Цитата:
Сообщение от Quantum1 Посмотреть сообщение
тут я если честно вообще нихрена не понимаю*)) откуда берется начальное old_val(или оно 0 по дефолту)? откуда формируется image?
Я ж рассказал что и откуда. Начните с более простых примеров accumulate если непонятно (хотя и тут вроде бы все не сильно сложнее).

4 параметр это функция (ну, указатель на нее или типа того, я не помню как там оно в С++ называется)
Можно объявить обычную функцию
Код:
koef_t accFunc(koef_t old_val, const neurons_line &image) {
    return ...;
}
И передать ее
Код:
accumulate(..., ..., ..., accFunc);
Но в современных версиях С++ удобнее делать это с помощью лямбд как тут.

-> koef_t это просто возвращаемый тип (в каких-то случаях вроде его можно не указывать явно)

[i, j] в самом начале говорит о том, что внутри функции будут доступны эти переменные (копии их значений) из основной функции. (по умолчанию в С++ лямбдах недоступно ничего, надо указывать вот так явно, или [=] чтоб все было доступно, http://stackoverflow.com/questions/7...ression-in-c11)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.02.2017 в 19:00.
Alex11223 вне форума Ответить с цитированием
Старый 19.02.2017, 20:16   #5
Quantum1
Новичок
Джуниор
 
Регистрация: 19.02.2017
Сообщений: 3
По умолчанию

В-о-о-о!! Теперь понятно! Спасибо огромное за оперативный ответ! С аккумулятором ясно!

осталось понять что конкретно имеется ввиду под const neurons_line &image, и const list &src_images
Quantum1 вне форума Ответить с цитированием
Старый 19.02.2017, 20:25   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А что с ними?

Что такое list надо искать в исходнике, наверно typedef типа std::vector<neurons_line>

image соответственно элемент этого списка.

const чтобы нельзя было изменять, а & (по ссылке) чтоб не было лишнего копирования при передаче.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что означает строка в коде: std::ofstream fs(name, std::ios::binary); egorsavenkov Помощь студентам 1 07.11.2016 12:45
std::cout уменьшает время выполнения программы. std::thread aako Visual C++ 0 13.11.2015 16:59
Заменить accumulate на count_if Yoh Помощь студентам 3 12.12.2013 05:15
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
вычислить среднее гармоническое значение элементов вектора чисел с плав точкой с пом алгоритма accumulate -GT- Общие вопросы C/C++ 2 28.11.2009 17:19