2016-02-07 88 views
8

我想要找出矩阵中对角线元素的总和。这里,n是方阵的大小,a是矩阵。有人可以向我解释这里发生了什么。矩阵中对角线元素的总和

n = 3 
a = [[11,2,4],[4,5,6],[10,8,-12]] 
sum_first_diagonal = sum(a[i][i] for i in range(n)) 
sum_second_diagonal = sum(a[n-i-1][n-i-1] for i in range(n)) 
print(str(sum_first_diagonal)+" "+str(sum_first_diagonal)) 
+0

您从顶部总结相同对角线两次,一次是从左上到右下和然后反过来。我不相信这个代码片段可以在任何Python安装中打印“4 4”以外的任何东西。 –

回答

4

尝试此总结您的第二倾斜:

sum(a[i][n-i-1] for i in range(n)) 

内环访问这些条目:

>>> n = 3 
>>> [(i, n-i-1) for i in range(n)] 
[(0, 2), (1, 1), (2, 0)] 

这对角线为您的样品基体的总和值:

>>> n = 3 
>>> sum(a[i][n-i-1] for i in range(n)) 
19 

在你的代码中的错误是使用相同的表达式为两个维度:

a[n-i-1][n-i-1] 

将按照相反的顺序[(2, 2), (1, 1), (0, 0)]再次处理的第一对角给你两次相同的总和。

6

使用numpy库是强大的任何矩阵计算。对于您的特定情况:

import numpy as np 
a = [[11,2,4],[4,5,6],[10,8,-12]] 
b = np.asarray(a) 
print 'Diagonal (sum): ', np.trace(b) 
print 'Diagonal (elements): ', np.diagonal(b) 

您可以使用点或其他方式轻松安装numpy,您可以在许多网站上找到它。

如果你想要所有的对角线,而不仅仅是主对角线,检查this也使用numpy。

编辑

mhawke,如果要计算antidiagonal(次对角线),如wikipedia解释,您可以翻转的numpy的

import numpy as np 
a = [[11,2,4],[4,5,6],[10,8,-12]] 
b = np.asarray(a) 
b = np.fliplr(b) 
print 'Antidiagonal (sum): ', np.trace(b) 
print 'Antidiagonal (elements): ', np.diagonal(b) 
+0

我认为OP无法使用'numpy',因为他们将代码提交给不允许'numpy'的在线裁判。第二对角线是如何计算的? – mhawke

0

矩阵试试这个:

n=3 
sum_second_diagonal=sum([a[i][j] for i in range(n) for j in range(n) if i+j==n-1]) 
0

由于您知道行i的对角线元素的位置,因此您可以将其写成qui TE密集,如:

d = sum(row[i] + row[-1-i] for i, row in a) 

而且,以奇数矩阵,你不应该添加两倍于中心元素:

if len(a)%2: 
    centre = len(a)//2 
    d -= a[centre][centre]