使用C++向量计算矩阵行列式的子式构建代码问题排查
C++矩阵行列式计算代码错误排查与修正
代码中的主要错误点:
- 变量拼写错误:
- 循环变量
postion拼写错误,应为position - 主函数调用
determinant时传入的matricx应为matrix
- 循环变量
- 未初始化变量:
int det, position;中det未初始化,直接累加会导致结果为随机垃圾值 - 二维vector越界访问:
minor初始为空,直接使用minor[i-1][j] = matrix[i][j]会访问不存在的元素,需先为minor分配行和元素空间 pow函数精度问题:pow(-1, position+2)返回double类型,和整数运算可能产生精度误差,改用整数奇偶性判断符号更可靠- main函数不规范:缺少返回类型
int,且未添加return 0; - 头文件缺失:使用
time(0)需要包含<ctime>头文件,否则编译报错 - minor矩阵构建逻辑错误:每次处理新的
position时未清空minor,且未正确逐行构建子矩阵
修正后的代码:
#include<iostream> #include<vector> #include<cmath> #include<cstdlib> #include<ctime> // 新增头文件,用于time(0) int determinant(std::vector<std::vector<int>>& matrix, int size) { // 行列式仅适用于方阵,仅保留一个size参数 if(size == 1) { return matrix[0][0]; } if(size == 2) { return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]; } int det = 0; // 初始化det为0 for(int position = 0; position < size; position++) { std::vector<std::vector<int>> minor; // 正确构建子矩阵minor for(int i = 1; i < size; i++) { std::vector<int> row; for(int j = 0; j < size; j++) { if(j != position) { row.push_back(matrix[i][j]); } } minor.push_back(row); } // 用奇偶性判断符号,替代pow函数避免精度问题 int sign = (position % 2 == 0) ? 1 : -1; det += sign * matrix[0][position] * determinant(minor, size - 1); } return det; } int main() { srand(time(0)); int input; int row, col; std::cin >> row >> col; // 提前判断是否为方阵,非方阵无行列式 if(row != col) { std::cout << "Error: Determinant only exists for square matrices." << std::endl; return 1; } std::vector<std::vector<int>> matrix; for(int i = 0; i < row; i++) { std::vector<int> temp; for(int j = 0; j < col; j++) { std::cin >> input; temp.push_back(input); } matrix.push_back(temp); } std::cout << "\nDeterminant: " << determinant(matrix, row) << std::endl; return 0; }
额外优化说明:
- 去掉冗余的
x和y参数,改用单个size参数(仅方阵有行列式) - 主函数添加非方阵判断逻辑,提前报错
- 用整数奇偶性计算符号,避免浮点数精度问题
- 每次循环重新创建
minor,避免旧数据干扰 - 将循环变量从
uint8_t改为int,避免矩阵大小超过255时溢出
内容的提问来源于stack exchange,提问作者Dimitrije Djokic
相关产品推荐
相关产品推荐

