[c++] ハライド - whileループ相当



Answers

Question

私はHalideでMeijster距離変換アルゴリズムを実装しようとしています。 私はすでにこのコードをC ++に書き直しました(openCVを使用しています)。 このアルゴリズムに関する論文はここにあります 。 私のハライドコードは50%完成しました - 最初の段階はうまくいきましたが、今では2段階(リンクされたコードで3つのスキャン)に問題があります。

//g is 2 dimensional cv::Mat (something like array) - result of previous stage
// m is g.width and n is g.height
int(*functionF)(int x, int i, int g_i) = EDT_f;
int(*functionSep)(int i, int u, int g_i, int g_u, int max_value) = EDT_Sep;
cv::Mat dt = cv::Mat(n, m, CV_32SC1);
int* s = new int[m];
int* t = new int[m];
int q = 0, w;

for (int y = 0; y<n; y++)
{
    q = 0;
    s[0] = 0;
    t[0] = 0;

    // Scan 3
    for (int u = 1; u<m; u++)
    {
    //how can i replace this loop:
        while (q >= 0 && functionF(t[q], s[q], g.at<int>(y, s[q])) > functionF(t[q], u, g.at<int>(y, u)))
            q--;
        //some operations which might change value of q, s[] and t[]
    }
    // Scan 4 - not important here
}

このループの間に交換するハロゲン化物に優しい方法はありますか? 今のところ私が今までに来た唯一の解決策は、このようなスマイル(まだテストされていない)です:

Expr calculateQ(Expr currentQValue, Expr y, Func t, Func s, Func g)
{
    //while (q >= 0 && functionF(t[q], s[q], g.at<int>(y, s[q])) > functionF(t[q], u, g.at<int>(y, u)))
        //q--;
    return select(currentQValue >= 0 && functionF(t[q], s[q], g[s[q], y]) > functionF(t[q], u, g[u, y]), calculateQ(currentQValue - 1, y, t, s, g), currentQValue);
}

これがうまくいくとしても、ほとんどの場合ハライドは条件をチェックする前にselectの両方の値を評価しようとしますが、再帰は非常に遅くなります。

Halideのループを実装する方法がない場合、Halideの内部でコードの一部を使用する方法はありますか? 他のアイデア?




Links