3

ハライドでコレスキー分解を実装しようとしています。crout などの一般的なアルゴリズムの一部は、三角行列の反復で構成されます。このように、分解の対角要素は、入力行列の対角要素から部分的な列の合計を減算することによって計算されます。列の合計は、対角要素を除く、入力行列の三角形部分の 2 乗要素に対して計算されます。

BLAS を使用すると、コードは C++ で次のようになります。

double* a; /* input matrix */
int n; /* dimension */
const int c__1 = 1;
const double c_b12 = 1.;
const double c_b10 = -1.;

for (int j = 0; j < n; ++j) {
    double ajj = a[j + j * n] - ddot(&j, &a[j + n], &n, &a[j + n], &n);
    ajj = sqrt(ajj);
    a[j + j * n] = ajj;
    if (j < n) {
            int i__2 = n - j;
            dgemv("No transpose", &i__2, &j, &c_b10, &a[j + 1 + n], &n, &a[j + n], &b, &c_b12, &a[j + 1 + j * n], &c__1);
            double d__1 = 1. / ajj;
            dscal(&i__2, &d__1, &a[j + 1 + j * n], &c__1);            
    }
}

私の質問は、このようなパターンが一般的に Halide で表現できるかどうかです。もしそうなら、それはどのように見えますか?

4

2 に答える 2

1

アンドリューはより完全な答えを持っていると思いますが、タイムリーな応答のために、RDom 述語 (RDom::where を介して導入) を使用して、三角形領域 (またはより多くの次元への一般化) を列挙することができます。パターンのスケッチは次のとおりです。

Halide::RDom triangular(0, extent, 0, extent);
triangular.where(triangular.x < triangular.y);

その後triangular、縮小して使用します。

于 2016-12-06T07:01:31.827 に答える