【发布时间】:2021-11-30 11:14:51
【问题描述】:
为了计算 PA = LU 分解,我设计了以下 C 函数,仅使用一个矩阵来存储和计算数据:
double plupmc(int n, double **c, int *p, double tol) {
int i, j, k, pivot_ind = 0, temp_ind;
int ii, jj;
double pivot, *temp_row;
for (j = 0; j < n-1; ++j) {
pivot = 0.;
for (i = j; i < n; ++i)
if (fabs(c[i][j]) > fabs(pivot)) {
pivot = c[i][j];
pivot_ind = i;
}
temp_row = c[j];
c[j] = c[pivot_ind];
c[pivot_ind] = temp_row;
temp_ind = p[j];
p[j] = p[pivot_ind];
p[pivot_ind] = temp_ind;
for (k = j+1; k < n; ++k) {
c[k][j] /= c[j][j];
c[k][k] -= c[k][j]*c[j][k];
}
}
return 0.;
}
其中 n 是矩阵的阶,c 是指向矩阵的指针,p 是指向存储在部分旋转系统时完成的排列的向量的指针。变量 tol 目前不相关。该程序将分解的下三角部分和上三角部分都存储在 c 中,其中 U 对应于 c 的上三角部分,L 对应于 c 的严格下三角部分,在对角线上添加 1。对于我能够测试的内容,与部分旋转对应的程序部分工作正常,但是,用于计算矩阵条目的算法没有给出预期的结果,我不明白为什么。例如,如果我尝试计算矩阵的 LU 分解
1. 2. 3.
4. 5. 6.
7. 8. 9.
我明白了
1. 0. 0. 7. 8. 9.
l : 0.143 1. 0. u : 0. 2. 1.714*
0.571 0.214* 1. 0. 0. 5.663*
其乘积不对应于矩阵 c 的任何排列。事实上,错误的条目似乎是标有星号的条目。
如果有任何解决此问题的建议,我将不胜感激。
【问题讨论】:
-
你需要交换整行!
标签: c matrix numerical-methods