下面显示的代码块有什么作用?我很困惑
if (temp != j)
for (k = 0; k < 2 * dimension; k++) {
temporary = augmentedmatrix[j][k];
augmentedmatrix[j][k] = augmentedmatrix[temp][k];
augmentedmatrix[temp][k] = temporary;
}
答案 0 :(得分:3)
编辑: 最初的问题是如何用高斯消元法计算逆矩阵。 OP已经坚持算法的实际消除部分。
现在如果元素1,1不为零,那么你将使用矩阵基本操作将元素2,1归零:
F_s,t - 交换行s和t
F_s,t_(a) - 将行t * a添加到s
F_s_(a) - 将行s乘以
您也可以将1,2元素归零。
这些操作对应于基本矩阵(和线性变换矩阵)。因为每个可逆矩阵可以表示为某些基本矩阵的乘积
A = P1,...,Pk,Ql,...,Q1
是可逆的,我们可以通过对原始矩阵A, A_inverse
应用相应的操作来检索A
的逆,这与A
的乘法P,Q
相同:< / p>
A_inverse = Q1_inv,...,Ql_inv,Pk_inv,...,P1_inv
对于矩阵中的每一行,如果该行不仅包含零, 那么最左边的非零项被称为领先系数 该行的(或枢轴)。因此,如果两个前导系数相同 列,然后可以使用类型3的行操作(见上文) 使其中一个系数为零。然后通过使用行交换 操作,总是可以对行进行排序,以便每个非零 行,领先系数是领先的权利 上面一行的系数。如果是这种情况,则表示矩阵 排成梯形式。所以矩阵的左下部分 仅包含零,并且所有零行都低于非零 行。这里使用“梯队”这个词是因为人们可以大致思考 按行大小排列的行,最大的行位于顶部 最小的是在底部。
现在基本上你应该存储增强矩阵
float augmentedmatrix[maximum][2*maximum] ;
因此您可以同时对矩阵A
和单位矩阵执行操作。
填写单位矩阵:
/* augmenting with identity matrix of similar dimensions */
for(i=0;i<dimension; i++)
for(j=dimension; j<2*dimension; j++)
if(i==j%dimension)
augmentedmatrix[i][j]=1;
else
augmentedmatrix[i][j]=0;
并通过以下方式对扩展矩阵执行Gauss-Jordan消除:
/* finding maximum jth column element in last (dimension-j) rows */
/* swapping row which has maximum jth column element */
/* performing row operations to form required identity matrix
out of the input matrix */
你缺少的是:
/* using gauss-jordan elimination */
for (j = 0; j < dimension; j++) {
temp = j;
/* finding maximum jth column element in last (dimension-j) rows */
for (i = j + 1; i < dimension; i++)
if (augmentedmatrix[i][j] > augmentedmatrix[temp][j])
temp = i;
if (fabs(augmentedmatrix[temp][j]) < minvalue) {
printf("\n Elements are too small to deal with !!!");
return -1;
}
/* swapping row which has maximum jth column element */
if (temp != j)
for (k = 0; k < 2 * dimension; k++) {
temporary = augmentedmatrix[j][k];
augmentedmatrix[j][k] = augmentedmatrix[temp][k];
augmentedmatrix[temp][k] = temporary;
}
/* performing row operations to form required identity matrix out
of the input matrix */
for (i = 0; i < dimension; i++)
if (i != j) {
r = augmentedmatrix[i][j];
for (k = 0; k < 2 * dimension; k++)
augmentedmatrix[i][k] -= augmentedmatrix[j][k] *
r / augmentedmatrix[j][j];
} else {
r = augmentedmatrix[i][j];
for (k = 0; k < 2 * dimension; k++)
augmentedmatrix[i][k] /= r;
}
}