【问题标题】:Diagonal in matrix - python矩阵中的对角线 - python
【发布时间】:2013-12-17 13:17:46
【问题描述】:

我需要编写一个函数,该函数将返回在任何给定矩阵中形成对角线的数字之和。
作为一个 Python 新手,我遇到了一个问题。这是我的代码:

def diagonal(matrix):
    return sum([matrix[i][i] for i in range(len(matrix))])

我已经尝试了一段时间,但看不出有什么问题,因为它总是给我返回关于“列表索引超出范围”的错误报告。

不允许导入numpy

我们将不胜感激任何形式的帮助、提示和建议。

【问题讨论】:

  • 你确定这个matrix 是正方形的吗?
  • matrix 到底是什么?使用matrix[i][i] 表示法假定它是一个列表(或者更确切地说,iterables)的列表,其大小应与@Ray 指出的相同,但您的问题尚不清楚。
  • 是的,我的矩阵是一个列表列表...而且它们的大小相同。
  • "它们的大小相同。"这将使矩阵成为矩形,但不一定是方形。列表列表中的列表数量是否与每个列表中的元素数量相同?
  • @user3036896 那么您最好提供代码失败的示例矩阵和准确的跟踪,因为您的代码应该适用于方形输入。

标签: python matrix range diagonal


【解决方案1】:

如果您确定您的矩阵是矩形的(len(matrix[i])matrix 中的所有列表相同),那么您可以对列表求和,只要您的维度较小:

def diagonal(matrix):
    return sum([matrix[i][i] for i in range(min(len(matrix[0]),len(matrix)))])

len(matrix) 是矩阵的第一维,len(matrix[0]) 是第一行向量的维,即矩形矩阵的第二维。

【讨论】:

  • 应有尽有。非常感谢。
  • @user3036896 请注意,您的 sum 很棘手,因为它可能没有任何意义,并且该函数实际上应该被称为 diagonal_or_something_else(matrix)
  • OP 和@Ray:Ray 是正确的,即未为非平方矩阵定义矩阵的迹线(即对角线之和)。但有趣的是,内置方法numpy.trace 不受平方矩阵和主对角线的限制。 numpy 不是线性代数模块的另一点:)
  • @leeladam 够有趣的哈!似乎 numpy 以严谨性换取可用性。 :)
【解决方案2】:

当任一索引超出相应维度时,您必须停止,例如,您可以使用切片限制矩阵:

def diagonal_sum(matrix):
    row_size = len(matrix[0])
    return sum(row[i] for i, row in enumerate(matrix[:row_size]))

演示:

>>> diagonal_sum([[1,2],[3,4],[5,6]])
5

【讨论】:

    【解决方案3】:

    我认为diagonal 没有为非方阵定义。所以我们最好不要选择二维的min,只为了让代码返回一些东西。

    那么不如来代替:

    def diagonal(matrix):
        try:
            return sum([matrix[i][i] for i in range(len(matrix))])
        except IndexError:
            print "Bad Matrix! :("
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多