You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:45:39