我正在尝试在 Halide 中实现 Cholesky 分解。部分常见算法(如 crout)包括对三角矩阵的迭代。在某种程度上,分解的对角元素是通过从输入矩阵的对角元素中减去部分列和来计算的。列和是在输入矩阵的三角形部分的平方元素上计算的,不包括对角元素。
使用 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 是否可以普遍表达这样的模式?如果是这样,它会是什么样子?