2016-02-07 18 views
8

Próbuję ustalić sumę przekątnych elementów w macierzy. Tutaj n jest wielkością macierzy kwadratowej, a a jest macierzą. Czy ktoś może mi wyjaśnić, co tu się dzieje?Suma przekątnych elementów w macierzy

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

Jesteś zsumowanie samej przekątnej dwa razy, raz z góry od lewej do prawej i dolnej potem na odwrót. Nie wierzę, że ten fragment kodu może drukować coś innego niż '4 4' na dowolnej instalacji Pythona. –

Odpowiedz

4

Spróbuj na zsumowanie twoja druga przekątna:

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

Wewnętrzna pętla dostęp do tych wpisów:

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

a zsumowane wartości tej przekątnej do matrycy próbki jest:

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

Błąd w kodzie jest użycie tego samego wyrażenia w obu wymiarach:

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

który przetworzy pierwszy przekątnej ponownie w odwrotnej kolejności [(2, 2), (1, 1), (0, 0)] daje taką samą sumę dwukrotnie.

6

Użyj biblioteki numpy, która jest potężna do obliczeń macierzy. W konkretnym przypadku:

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) 

Możesz łatwo zainstalować numpy z pip lub innymi sposobami, które znajdziesz na wielu stronach internetowych.

Jeśli chcesz, aby wszystkie przekątne, a nie tylko główna przekątna, sprawdź this, która również używa numpy.

EDIT

mhawke, jeśli chcesz obliczyć antidiagonal (wtórny po przekątnej), jak wyjaśniono w wikipedia można odwrócić matrycy w 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

Myślę, że OP nie może używać 'numpy', ponieważ przesyła swój kod do sędziego internetowego, który nie zezwala na' numpy'. Jak oblicza się drugą przekątną? – mhawke

0

spróbować tego:

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

Ponieważ znasz położenie przekątnych dla rzędu i, możesz napisać to qui Te gęsto jak:

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

A dla nieparzystych rozmiarach matryc, nie należy dodać element środkowy dwukrotnie:

if len(a)%2: 
    centre = len(a)//2 
    d -= a[centre][centre] 
Powiązane problemy