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; } } }
时间: 2023-12-10 16:05:12 浏览: 31
这段代码是矩阵类 `CMatrix` 的求逆函数 `Inv()`,用于计算矩阵的逆矩阵。
在函数内部,首先进行行列数的检查,判断矩阵是否为方阵(行数等于列数)。如果不是方阵,则抛出异常并给出错误信息。
然后,创建一个新的矩阵对象 `InvMat`,其大小与当前矩阵对象相同,并将当前矩阵对象复制给 `InvMat`。
接下来,创建两个整型数组 `MainRow` 和 `MainCol`,用于记录主元素的行和列。
定义两个浮点型变量 `dMainCell` 和 `dTemp`,分别用于存储主元素的值和临时变量。
接下来,使用一个循环来选取全主元。对于每个主元所在的位置 `(k, k)`,从该位置开始遍历矩阵的子矩阵(从第 `k` 行和第 `k` 列开始),找到子矩阵中绝对值最大的元素,并记录其行和列。
在这个循环中,首先将 `dMainCell` 初始化为 0,然后遍历子矩阵,找到绝对值最大的元素,并将其值赋给 `dMainCell`。同时,记录该元素所在的行和列。
请注意,在这段代码中,只有找到了绝对值最大的元素后,才会更新主元素的行和列。
这部分代码只是求逆过程的一小部分,后续代码应该包含高斯-约旦消元等算法来完成求逆的过程。
相关问题
CMatrix& CMatrix::operator = (const CMatrix& m) { if (iRow != m.Row() || iCol != m.Col()) { SetSize(m.Row(), m.Col()); } for (int i = 0; i < iRow; i++) { for (int j = 0; j < iCol; j++) { dMatData[i][j] = m(i, j); } } return *this; }
这段代码是矩阵类 `CMatrix` 的赋值运算符重载函数,用于将一个矩阵对象 `m` 的值赋给当前的矩阵对象。
重载的赋值运算符接受一个参数:矩阵对象 `m`,表示要赋值的矩阵对象。
在函数内部,首先进行大小检查,判断当前矩阵对象和要赋值的矩阵对象的行数和列数是否相等。如果不相等,则调用 `SetSize()` 方法来重新设置当前矩阵对象的大小,使其与要赋值的矩阵对象相同。
接下来,使用两个嵌套的循环遍历每一个元素,将要赋值的矩阵对象 `m` 的对应位置的元素值赋给当前矩阵对象的对应位置。
最后,返回当前矩阵对象的引用 `*this`。
通过重载赋值运算符,可以使用 `matrix1 = matrix2` 的形式将一个矩阵对象的值赋给另一个矩阵对象。
请注意,在使用赋值运算符时,如果两个矩阵对象的大小不同,会重新设置当前矩阵对象的大小,并且会复制对应位置的元素值。另外,返回的是当前矩阵对象的引用,以支持连续赋值操作。
double& CMatrix::operator () (int row, int col) { if (row >= iRow || col >= iCol) { throw("CMatrix::operator(): Index out of range!"); } return dMatData[row][col]; }
这段代码是矩阵类 `CMatrix` 的括号运算符重载函数,用于通过括号运算符访问矩阵对象的元素。
重载的括号运算符接受两个参数:行数 `row` 和列数 `col`,用于指定要访问的元素的位置。
在函数内部,首先进行越界检查,判断传入的行数 `row` 和列数 `col` 是否超出了矩阵的有效范围。如果超出范围,则抛出异常并给出错误信息。
如果没有越界,则返回指定位置的矩阵元素的引用 `dMatData[row][col]`。
通过重载括号运算符,可以像访问数组元素一样使用括号来访问矩阵对象的元素。例如,`matrix(0, 0)` 可以用来获取矩阵的第一个元素。同时,由于返回的是元素的引用,还可以对元素进行赋值操作。
请注意,在使用括号运算符访问矩阵元素时,应该确保传入的行数和列数在有效范围内,以避免越界访问导致的错误。