高斯消元逆矩阵

时间:2013-11-24 00:05:23

标签: c++ math matrix-inverse

下面显示的代码块有什么作用?我很困惑

  if (temp != j)
        for (k = 0; k < 2 * dimension; k++) {
            temporary = augmentedmatrix[j][k];
            augmentedmatrix[j][k] = augmentedmatrix[temp][k];
            augmentedmatrix[temp][k] = temporary;
        }

1 个答案:

答案 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;
        }
}