for (i = 0; i < iRow; i++)//消元 { if (i != k) { for (j = 0; j < iRow; j++) { if (j != k) { InvMat(i, j) -= InvMat(i, k) * InvMat(k, j); } } } } for (i = 0; i < iRow; i++)//计算主列 { if (i != k) { InvMat(i, k) = -InvMat(i, k) * InvMat(k, k); } }
时间: 2024-04-11 07:30:13 浏览: 61
这部分代码是矩阵类 `CMatrix` 的求逆函数 `Inv()` 中的另一部分。以下是代码的解释:
首先,使用一个循环遍历当前矩阵对象的所有行。对于每个非主元素行 `i`,进行消元操作。在消元操作中,使用另外两个嵌套的循环遍历当前矩阵对象的所有列。对于每个非主元素列 `j`,将主元素所在行 `k` 的元素值乘以非主元素行 `i` 的元素值,并将结果减去非主元素行 `i`、非主元素列 `j` 的原值。这样可以消除非主元素行 `i` 和非主元素列 `j` 之间的关联。
接下来,使用另一个循环遍历当前矩阵对象的所有行。对于每个非主元素行 `i`,计算主列。将非主元素行 `i` 的元素值乘以主元素所在列 `k` 的元素值,并将结果取负。然后将结果赋值给非主元素行 `i`、主元素所在列 `k` 的位置。
通过这部分代码,可以完成矩阵求逆过程中的消元和计算主列的操作。这些操作将逐步将矩阵转化为单位矩阵,从而得到矩阵的逆矩阵。
相关问题
if (MainCol[k] != k)//交换列 { for (i = 0; i < iRow; i++) { vv = MainCol[k]; dTemp = InvMat(i, k); InvMat(i, k) = InvMat(i, vv); InvMat(i, vv) = dTemp; } } InvMat(k, k) = 1.0 / InvMat(k, k);//计算乘数 for (j = 0; j < iRow; j++) //计算主行 { if (j != k) { InvMat(k, j) = InvMat(k, j) * InvMat(k, k); } }
这部分代码是矩阵类 `CMatrix` 的求逆函数 `Inv()` 中的另一部分。以下是代码的解释:
首先,判断主元素所在的列 `MainCol[k]` 是否等于当前要处理的列 `k`。如果不相等,则需要进行列交换操作。
在列交换操作中,使用一个循环遍历当前矩阵对象的所有行。首先,将变量 `vv` 设置为 `MainCol[k]`,即主元素所在的列。然后,将当前列 `k` 和主元素所在的列 `vv` 进行交换,即将当前列的元素赋值给主元素所在的列,同时将主元素所在的列的元素赋值给当前列。
接下来,计算乘数,将主元素所在位置的元素设为其倒数,即 `InvMat(k, k) = 1.0 / InvMat(k, k)`。
最后,使用一个循环遍历当前矩阵对象的所有列,计算主行。对于每个非主元素行 `j`,将其元素乘以主元素所在位置的元素值,并存储回原位置。
通过这部分代码,可以处理矩阵求逆过程中需要进行的列交换操作,并计算乘数和更新主行的值。请注意,在进行列交换时,需要遍历所有的行,并交换每一行的元素值。
CMatrix CMatrix::Inv() { if (iRow != iCol) { throw("待求逆的矩阵行列不相等!"); } int i, j, k, vv; CMatrix InvMat(iRow, iRow); //复制矩阵 InvMat = *this; int* MainRow = new int[iRow]; int* MainCol = new int[iRow];//用于记录主元素的行和列 double dMainCell;//主元元素的值 double dTemp;//临时变量 for (k = 0; k < iRow; k++) { dMainCell = 0; //选全主元 for (i = k; i < iRow; i++) { for (j = k; j < iRow; j++) { dTemp = fabs(InvMat(i, j)); if (dTemp > dMainCell) { dMainCell = dTemp; MainRow[k] = i; MainCol[k] = j; } } }
这段代码是矩阵类 `CMatrix` 的求逆函数 `Inv()`,用于计算矩阵的逆矩阵。
在函数内部,首先进行行列数的检查,判断矩阵是否为方阵(行数等于列数)。如果不是方阵,则抛出异常并给出错误信息。
然后,创建一个新的矩阵对象 `InvMat`,其大小与当前矩阵对象相同,并将当前矩阵对象复制给 `InvMat`。
接下来,创建两个整型数组 `MainRow` 和 `MainCol`,用于记录主元素的行和列。
定义两个浮点型变量 `dMainCell` 和 `dTemp`,分别用于存储主元素的值和临时变量。
接下来,使用一个循环来选取全主元。对于每个主元所在的位置 `(k, k)`,从该位置开始遍历矩阵的子矩阵(从第 `k` 行和第 `k` 列开始),找到子矩阵中绝对值最大的元素,并记录其行和列。
在这个循环中,首先将 `dMainCell` 初始化为 0,然后遍历子矩阵,找到绝对值最大的元素,并将其值赋给 `dMainCell`。同时,记录该元素所在的行和列。
请注意,在这段代码中,只有找到了绝对值最大的元素后,才会更新主元素的行和列。
这部分代码只是求逆过程的一小部分,后续代码应该包含高斯-约旦消元等算法来完成求逆的过程。
阅读全文