gpt4 book ai didi

c - 乘以 CHOLMOD 中的超结 L?

转载 作者:行者123 更新时间:2023-11-30 15:31:05 26 4
gpt4 key购买 nike

如何在超节点 L L^T 分解中乘以 cholmod_factor L?我不想转换为单纯形,因为超节点表示会导致更快的反解,而且我不想复制因子,因为两个副本可能不适合 RAM。

最佳答案

我最终从 t_cholmod_change_factor.c 中的 supernode-to-simplicial 辅助函数中的一个很好的注释中理解了 supernodal 表示。我解释一下评论并在下面添加一些细节:

超节点 Cholesky 分解表示为超节点 block 的集合。 super 节点 block 的条目按列主顺序排列,就像这个 6x4 super 节点一样:

t - - -    (row s[pi[snode+0]])
t t - - (row s[pi[snode+1]])
t t t - (row s[pi[snode+2]])
t t t t (row s[pi[snode+3]])
r r r r (row s[pi[snode+4]])
r r r r (row s[pi[snode+5]])
  • 为了使矩阵成为矩形,存在未使用的条目(由连字符表示)。
  • 列索引是连续的。
  • 第一个 ncols 行索引是那些相同的连续列索引。后面的行索引可以引用 t 三角形下方的任何行。
  • 每个 super 节点的super成员都有一个条目;它指的是 super 节点代表的第一列。
  • pi 成员对于每个 super 节点都有一个条目;它引用 s 成员中的第一个索引,您可以在其中查找行号。
  • px 成员对于每个 super 节点都有一个条目;它引用存储条目的 x 成员中的第一个索引。再次强调,这不是打包存储。

以下乘以 cholmod_factor *L 的代码似乎可以工作(我只关心 int 索引和 double 实数条目):

cholmod_dense *mul_L(cholmod_factor *L, cholmod_dense *d) {
int rows = d->nrow, cols = d->ncol;
cholmod_dense *ans = cholmod_allocate_dense(rows, cols, rows,
CHOLMOD_REAL, &comm);
memset(ans->x, 0, 8 * rows * cols);

FOR(i, L->nsuper) {
int *sup = (int *)L->super;
int *pi = (int *)L->pi;
int *px = (int *)L->px;
double *x = (double *)L->x;
int *ss = (int *)L->s;

int r0 = pi[i], r1 = pi[i+1], nrow = r1 - r0;
int c0 = sup[i], c1 = sup[i+1], ncol = c1 - c0;
int px0 = px[i];

/* TODO: Use BLAS instead. */
for (int j = 0; j < ncol; j++) {
for (int k = j; k < nrow; k++) {
for (int l = 0; l < cols; l++) {
((double *)ans->x)[l * rows + ss[r0 + k]] +=
x[px0 + k + j * nrow] * ((double *)d->x)[l*rows+c0 + j];
}
}
}
}
return ans;
}

关于c - 乘以 CHOLMOD 中的超结 L?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com