2016-02-07 30 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

あなたが左上から右下に1回、2回同じ対角線を加算しているとし、それから別の方法です。私はこのコードスニペットがPythonのインストールで '4 4'以外のものを印刷できるとは思わない。 –

答えて

4

2番目の対角を合計するためにこれを試してみてください:

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

そして、あなたのサンプルマトリックスのため、この対角線の合計値です:

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

内側のループは、これらのエントリにアクセス

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

二回あなたと同じ合計を与え、逆の順序[(2, 2), (1, 1), (0, 0)]に再び第1対角線を処理する

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

:あなたのコード内の間違いは、両方の次元で同じ表現を使用することです。

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を簡単にインストールできます。

メイン対角線だけでなく、すべての対角線が必要な場合は、numpyも使用するthisをチェックしてください。

EDIT

mhawke、あなたがwikipediaで説明したように、(二対角)antidiagonal計算したい場合は、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

私は、numpyを許可しないオンラインジャッジにコードを提出しているので、OPはnumpyを使用できないと思います。 2番目の対角はどのように計算されますか? – 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の対角要素の位置を知っているので、それを簡単に書くことができます密のような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] 
関連する問題