1

ここに問題があります。非線形最適化にはminpackを使用しています。コスト関数には次のシグネチャがあります。

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

n-初期点のサイズm-関数ベクトルのサイズp-初期点x-関数ベクトル

オブジェクトの配列を反復処理するforループがあります。各オブジェクトには、最適化関数の入力情報が含まれています。

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);
}

しかし、コスト関数では、現在のオブジェクトに関連する特定の値が必要です。コスト関数がクラスメンバーである場合、ポインターの型が間違っているため、このポインターを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はこのグローバルオブジェクトを使用して必要な情報を受け取ります。しかし、それは良くありません。この問題の正しい解決策は何ですか?ありがとう。

4

2 に答える 2

2

それらmn、、fvec配列がクラスメンバーになることができる場合は、offsetofマクロを使用してクラスのアドレスを回復できます。(これを行う方法については、非標準container_ofマクロのこの説明をお読みください)

それらが動的に割り当てられる場合、それはより困難ですが、バッファーに余分なスペースを割り当て、実際の配列データの前にクラスへのポインターを置くことができます。

于 2012-01-30T18:36:45.183 に答える
-1

グローバルオブジェクトを使用する必要があります。

サンクを使用する可能性はありますが、これらは複雑です。

于 2012-01-30T18:26:37.373 に答える