Ceres-Solver завершается с ошибкой «Завершение: оценка невязки и якобиана не удалась».когда нестатическая переменная используется для определения цикла Якобиана - PullRequest
1 голос
/ 09 июня 2019

У меня есть нелинейная система, которую я использую для решения Цереры.Это разреженная система с разреженной блочной структурой.Поскольку я также работаю с данными изображений, я основал свой код на примере «denoising.cc».

Проблема, с которой я сталкиваюсь, заключается в том, что мой код завершается с ошибкой «Завершение: Остаточная и Якобианская оценка завершились неудачно».Я могу решить эту проблему, жестко закодировав переменную 'num_weights' в Evaluate.

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

Любое понимание того, почему это поможет.

Спасибо!

Cost::Cost(const std::vector<double> &weights) : _weights(weights)
{
    set_num_residuals(1);
    mutable_parameter_block_sizes()->push_back(1); //has more parameters than weights

    for (int i = 0; i < _weights.size(); ++i)
        mutable_parameter_block_sizes()->push_back(1);
}

bool Cost::Evaluate(double const* const* parameters,
                             double *residuals,
                             double **jacobians) const
{
    int num_weights = (int)_weights.size();

    float d0 = parameters[0][0];
    residuals[0] = d0;

    for (int i = 0; i < num_weights; ++i)
    {
        residuals[0] += parameters[i+1][0];
    }

    if (jacobians != NULL)
    {
        for (int i = 0; i < num_weights+1; ++i)
        {
            if (jacobians[i] != NULL)
            {
                jacobians[i][0] = 0;
            }
        }
    }

    return true;
}

1 Ответ

0 голосов
/ 09 июня 2019

Просто разобрался.

По сути, мой вектор "std :: vector weights" вышел из области видимости. Функция ceres cost не сохраняет владение вектором, поэтому значение «num_weights» оценивается как 0.

...