Передача информации об объекте в функцию стоимости - PullRequest
1 голос
/ 30 января 2012

Вот проблема.Я использую minpack для нелинейной оптимизации.Функция стоимости имеет следующую подпись:

void cost_function(const int* n, const int* m,const double *p, double *x, int* iflag)

n - размер начальной точки m - размер вектора функции p - начальная точка x - вектор функции

У меня есть цикл, гдеперебирать массив объектов.Каждый объект содержит входную информацию для функции оптимизации.

for(int counter = 0; i < num_of_objects; ++counter)
{
    //get information from object
    //call optimization function
    lmdif1_(cost_function, m, n, initial_point, X, precision, info, iwa, wa, lwa);
}

, но в функции стоимости мне нужны определенные значения, связанные с текущим объектом.Если функция cost будет членом класса, указатель будет иметь неправильный тип, и будет невозможно передать этот указатель в lmdif1 _.

Так что теперь у меня есть временное решение с использованием глобального объекта.

for(int counter = 0; i < num_of_objects; ++counter)
{
    //get information from object
    //call optimization function
    global_obj = object;
    lmdif1_(cost_function, m, n, initial_point, X, precision, info, iwa, wa, lwa);
}

Затем функция cost_function использует этот глобальный объект для получения необходимой информации.Но это не хорошо.Каково правильное решение этой проблемы?Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Если эти массивы m, n, fvec могут быть членами класса, вы можете использовать макрос offsetof для восстановления адреса класса.(Чтобы узнать, как это сделать, прочитайте это объяснение нестандартного container_of макроса )

Если они расположены динамически, это сложнее, но вы можете выделить дополнительное место вбуфера и поместите указатель на ваш класс перед фактическими данными массива.

0 голосов
/ 30 января 2012

Вам придется использовать глобальный объект.

Существует возможность использования громоотводов, но они сложны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...