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
相关产品推荐
相关产品推荐

