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 = 0
和j = 0
;然后我进一步深入到代码中,我们得到了这个:for(k)
循环。现在我的第一个问题就是这个问题,因为j=0
在第一个实例中这个for循环没有得到评估,因为k
小于j
。
for (int k = 0; k < j; k++)
但是这个for循环下面的kode是如何评估的。
由于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
得到评估吗?
真的很感激我能得到的所有帮助。
谢谢,
答案 0 :(得分:1)
如果添加所有花括号,并将三元运算符转换为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;
}
代码执行如下:
i = 0
,假设i
小于n
则j = 0
,j
小于i+1
(1
),以便运行s = 0
k = 0
,但由于k < j
(0 < 0
)为false,循环C中的代码不运行然后循环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 = 0
和j = 0
,L[i * n + j]
设置为sqrt(A[i * n + i] - s)
j
增加到1
,但由于j < (i+1)
(1 < 1
)为false,因此终止i
增加到1
,假设i
小于n
则运行j = 0
,j
小于i+1
(2
),以便运行s
设置为0
k = 0
,但由于k < j
(0 < 0
)为false,循环C中的代码不运行i == j
为false,因此L[i * n + j]
设置为(1.0 / L[j * n + j] * (A[i * n + j] - s))
j
增加到1
,并且由于j < (i+1)
(1 < 2
)为真,所以它会运行s
设置为0
k = 0
,并且由于k < j
(0 < 1
)为真,它运行s
增加L[i * n + k] * L[j * n + k]
k
增加到1
,但由于k < j
(1 < 1
)为false,因此终止i == j
为真,因此L[i * n + j]
设置为sqrt(A[i * n + i] - s)
j
增加到2
,但由于j < (i+1)
(2 < 2
)为false,因此终止i
增加到2
,假设i
小于n
则运行