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

C++矩阵指定对角线区域置零异常问题排查求助

矩阵对角线置零方法的问题排查与修复

我基于基类Matrix派生出多个子类,分别实现了以下四个方法以将矩阵对应区域置零:

  • nullifyAboveMainDiagonal:将主对角线上方的元素置零
  • nullifyBelowMainDiagonal:将主对角线下方的元素置零
  • nullifyAboveSecondaryDiagonal:将副对角线上方的元素置零
  • nullifyBelowSecondaryDiagonal:将副对角线下方的元素置零

但运行后输出结果不符合预期,以下是完整代码、输入文件、预期输出及实际输出:

代码实现

基类Matrix

class Matrix:
    def __init__(self, data):
        self.data = data
        self.rows = len(data)
        self.cols = len(data[0]) if self.rows > 0 else 0

    def print_matrix(self):
        for row in self.data:
            print(' '.join(map(str, row)))

子类实现(错误版本)

class MainDiagonalAbove(Matrix):
    def nullifyAboveMainDiagonal(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if j < i:  # 条件逻辑错误
                    self.data[i][j] = 0

class MainDiagonalBelow(Matrix):
    def nullifyBelowMainDiagonal(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if j > i:  # 条件逻辑错误
                    self.data[i][j] = 0

class SecondaryDiagonalAbove(Matrix):
    def nullifyAboveSecondaryDiagonal(self):
        n = self.rows
        for i in range(self.rows):
            for j in range(self.cols):
                if i + j > n - 1:  # 条件逻辑错误
                    self.data[i][j] = 0

class SecondaryDiagonalBelow(Matrix):
    def nullifyBelowSecondaryDiagonal(self):
        n = self.rows
        for i in range(self.rows):
            for j in range(self.cols):
                if i + j < n - 1:  # 条件逻辑错误
                    self.data[i][j] = 0

输入文件 input_matrix.txt

1 2 3
4 5 6
7 8 9

预期输出

nullifyAboveMainDiagonal 预期

1 0 0
4 5 0
7 8 9

nullifyBelowMainDiagonal 预期

1 2 3
0 5 6
0 0 9

nullifyAboveSecondaryDiagonal 预期

0 0 3
0 5 6
7 8 9

nullifyBelowSecondaryDiagonal 预期

1 2 3
4 5 0
7 0 0

实际输出(错误版本)

nullifyAboveMainDiagonal 实际

1 2 3
0 5 6
0 0 9

nullifyBelowMainDiagonal 实际

1 0 0
4 5 0
7 8 9

nullifyAboveSecondaryDiagonal 实际

1 2 3
4 5 0
7 0 0

nullifyBelowSecondaryDiagonal 实际

0 0 3
0 5 6
7 8 9

问题排查与修复

核心问题是对角线区域的判断条件逻辑错误,以下是各个方法的正确实现:

1. nullifyAboveMainDiagonal 修复

主对角线是行号i等于列号j的位置,上方区域指列号大于行号(j > i)的元素,对应矩阵右上部分:

class MainDiagonalAbove(Matrix):
    def nullifyAboveMainDiagonal(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if j > i:
                    self.data[i][j] = 0

2. nullifyBelowMainDiagonal 修复

主对角线下方区域指行号大于列号(i > j)的元素,对应矩阵左下部分:

class MainDiagonalBelow(Matrix):
    def nullifyBelowMainDiagonal(self):
        for i in range(self.rows):
            for j in range(self.cols):
                if i > j:
                    self.data[i][j] = 0

3. nullifyAboveSecondaryDiagonal 修复

副对角线是行号+列号等于n-1(n为矩阵阶数,仅支持方阵)的位置,上方区域指行号+列号小于n-1的元素,对应矩阵左上部分:

class SecondaryDiagonalAbove(Matrix):
    def nullifyAboveSecondaryDiagonal(self):
        if self.rows != self.cols:
            raise ValueError("副对角线操作仅支持方阵")
        n = self.rows
        for i in range(self.rows):
            for j in range(self.cols):
                if i + j < n - 1:
                    self.data[i][j] = 0

4. nullifyBelowSecondaryDiagonal 修复

副对角线下方区域指行号+列号大于n-1的元素,对应矩阵右下部分:

class SecondaryDiagonalBelow(Matrix):
    def nullifyBelowSecondaryDiagonal(self):
        if self.rows != self.cols:
            raise ValueError("副对角线操作仅支持方阵")
        n = self.rows
        for i in range(self.rows):
            for j in range(self.cols):
                if i + j > n - 1:
                    self.data[i][j] = 0

额外注意事项

  • 副对角线操作仅适用于方阵(行数=列数),建议添加合法性校验避免非方阵导致的逻辑错误。
  • 若矩阵索引从1开始,需同步调整循环范围与判断条件(核心逻辑j > i、i > j、i+j < n-1、i+j > n-1依然成立)。

内容的提问来源于stack exchange,提问作者Andrii Chykulai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:45:11