Здравствуйте. Пишу метод покоординатного спуска на C
для функции с большим числом аргументов. Возник такой вопрос.
На каждом шаге нужно фиксировать значения всех переменных кроме
, получая одномерную функцию
, по которой проводить одномерную оптимизацию.
Я планировал написать отдельно функцию одномерной оптимизации, в которую в качестве аргумента каждый раз передавать каррированную по нужной координате функцию.
Будь функция двух-трех переменных, то можно было бы сделать как-то так:
Код:
#include <iostream>
#include <functional>
using namespace std;
typedef double R;
auto f(R x, R y, R z) -> R {
return x + 2 * y + 3 * z;
}
auto main() -> int {
auto fx = [=](R x) {
return f(x, 0, 0);
};
auto fy = [=](R y) {
return f(0, y, 0);
};
auto fz = [=](R z) {
return f(0, 0, z);
};
cout << fx(5) << endl; // 5
cout << fy(5) << endl; // 10
cout << fz(5) << endl; // 15
return 0;
}
Но если функция от большого числа параметров, то расписывать так для каждого аргумента выйдет слишком громоздко. В качестве аргумента удобно брать вектор или массив, например:
Код:
typedef array<R, n> Rn;
auto F(Rn x) -> R;
В гугле, к сожалению, подходящей информации не нашел.
Можно ли как-то реализовать каррирование для аргумента-вектора?