Ceresを使用して解決している非線形システムがあります。まばらなブロック構造を持つまばらなシステムです。私は画像データにも取り組んでいるので、「denoising.cc」の例に基づいてコードを作成しました。
私が遭遇している問題は、コードが「終了: 残差およびヤコビアンの評価に失敗しました。」で失敗することです。Evaluate で変数 'num_weights' をハードコーディングすることで問題を解決できます。
この関数を 1 つまたは複数のピクセルで呼び出すと、問題は解決しません。ピクセルごとに、重みが異なります。
これがなぜなのかについての洞察は役に立ちます。
ありがとう!
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;
}