2013-12-17 453 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! :("