2013-12-17 79 views
1

我需要编写一个函数来返回任意给定矩阵中形成对角线的数字之和。
作为一个Python新手我有一个问题。这是我的代码:矩阵中的对角线-python

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

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

我是不是允许导入numpy

任何形式的帮助,提示,意见将不胜感激。

+7

你确定这个'矩阵'是一个正方形吗? – Ray

+1

无论如何,矩阵是什么?使用'矩阵[i] [i]'表示法假定它是一个列表(或者说,迭代器),应该和@Ray指出的列表大小相同,但是从你的问题来看还不清楚。 – Tibo

+0

是的,我的矩阵是一个列表清单......而且它们的大小相同。 “ – Doe

回答

4

如果你确信你的矩阵是矩形(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])是第一行向量,它是矩形矩阵的第二维度的维数。

+0

确实如此。非常感谢你。 – Doe

+0

@ user3036896请注意,您的总和很棘手,因为它可能没有任何意义,函数实际上应该被称为'diagonal_or_something_else(矩阵)' – Ray

+0

OP和@Ray:Ray正确的是矩阵的轨迹(它是对角线)没有为非平方矩阵定义。但有趣的是,内置方法[numpy.trace](http://docs.scipy.org/doc/numpy/reference/generated/numpy.trace.html)不限于平方矩阵或主对角线。另一点,numpy不是一个线性代数模块:) – leeladam

2

你必须停止当任一指标exceds的相应尺寸,例如,你可以限制矩阵切片:

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 
1

我觉得diagonal不用于非定义方矩阵。所以我们最好不要选择两维的min只让代码返回一些东西。

因此,如何来代替:

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