gpt4 book ai didi

Cholesky 分解的 C 语法

转载 作者:行者123 更新时间:2023-11-30 14:56:24 26 4
gpt4 key购买 nike

double *cholesky(double *A, int n) {
double *L = (double*)calloc(n * n, sizeof(double));
if (L == NULL)
exit(EXIT_FAILURE);
for (int i = 0; i < n; i++)
for (int j = 0; j < (i+1); j++) {
double s = 0;
for (int k = 0; k < j; k++)
s += L[i * n + k] * L[j * n + k];
L[i * n + j] = (i == j) ?
sqrt(A[i * n + i] - s) :
(1.0 / L[j * n + j] * (A[i * n + j] - s));
}
return L;
}

现在我对这段代码的问题如下,我试图一步一步地查看该代码,但我有点困惑。

当我写作时

for(condition)
for(condition){
For(k=0;k<j;k++)
s += L[i * n + k] * L[j * n + k];
L[i * n + j] = (i == j) ?
sqrt(A[i * n + i] - s) :
(1.0 / L[j * n + j] * (A[i * n + j] - s));

}

这就是我所看到的情况:

第一i = 0j = 0 ;然后我进一步查看代码,我们得到:for(k)环形。现在我的第一个问题是自j=0以来首先,这个 for 循环不会被评估,因为 k小于j

for (int k = 0; k < j; k++)

但是这个 for 循环下面的代码确实得到了评​​估。自 L是一个零数组,那么 s+=l[0]*l[0]应等于 0 ,但我根本不明白循环是如何运行的。接下来执行 for(k) 下面的所有其他操作得到评价?

如果是这样i==j是这样L[i * n + j] = sqrt(A[i * n + i] - s) (在本例中等于 0)。

现在回到顶部,我的嵌套问题变成了

for(condition i )
for(condition j)

没有括号for(i=1 )for(j)之后进行评估j=0 之前被评估两次以下和j=i

非常感谢我能得到的所有帮助。

谢谢,

最佳答案

如果添加所有大括号,并将三元运算符转换为 if-else 语句,此代码可能会更容易理解:

double *cholesky(double *A, int n) {
double *L = (double*)calloc(n * n, sizeof(double));
if (L == NULL) {
exit(EXIT_FAILURE);
}
for (int i = 0; i < n; i++) { // loop A
for (int j = 0; j < (i+1); j++) { // loop B
double s = 0;
for (int k = 0; k < j; k++) { // loop C
s += L[i * n + k] * L[j * n + k];
}
// still in loop B
if (i == j) {
L[i * n + j] = sqrt(A[i * n + i] - s);
} else {
L[i * n + j] = (1.0 / L[j * n + j] * (A[i * n + j] - s));
}
}
}
return L;
}

代码执行过程如下:

  1. 循环 A 启动并设置 i = 0 ,并假设i小于n它运行
  2. 循环 B 启动并设置 j = 0 , j小于i+1 (1)所以它运行
  3. s = 0
  4. 循环 C 启动并设置 k = 0 ,但自从 k < j ( 0 < 0 ) 为 false,循环 C 中的代码不运行
  5. 循环 B 的其余部分然后执行:

    if (i == j) {
    L[i * n + j] = sqrt(A[i * n + i] - s);
    } else {
    L[i * n + j] = (1.0 / L[j * n + j] * (A[i * n + j] - s));
    }

    i = 0j = 0 , L[i * n + j]设置为sqrt(A[i * n + i] - s)

  6. 循环 B 增量 j1 ,但自从 j < (i+1) ( 1 < 1 ) 为 false,终止
  7. 循环 A 增量 i1 ,并假设i小于n它运行
  8. 循环 B 启动并设置 j = 0 , j小于i+1 (2)所以它运行
  9. s设置为0
  10. 循环 C 启动并设置 k = 0 ,但自从 k < j ( 0 < 0 ) 为 false,循环 C 中的代码不运行
  11. 循环 B 的其余部分运行。 i == j是假的,所以L[i * n + j]设置为(1.0 / L[j * n + j] * (A[i * n + j] - s))
  12. 循环 B 增量 j1 ,并且自 j < (i+1) ( 1 < 2 ) 为 true,它运行
  13. s设置为0
  14. 循环 C 启动并设置 k = 0 ,并且自 k < j ( 0 < 1 ) 为 true,它运行
  15. s增加 L[i * n + k] * L[j * n + k]
  16. 循环 C 增量 k1 ,但自从 k < j ( 1 < 1 ) 为 false,终止
  17. 循环 B 的其余部分运行。 i == j是真的,所以L[i * n + j]设置为sqrt(A[i * n + i] - s)
  18. 循环 B 增量 j2 ,但自从 j < (i+1) ( 2 < 2 ) 为 false,终止
  19. 循环 A 增量 i2 ,并假设i小于n它运行
  20. ...

关于Cholesky 分解的 C 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44715982/

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