web-dev-qa-db-fra.com

Somme des éléments diagonaux dans une matrice

J'essaie de trouver la somme des éléments diagonaux dans une matrice. Ici, n est la taille de la matrice carrée et a est la matrice. Quelqu'un peut-il m'expliquer ce qui se passe ici?.

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))
12
Hassan Imam

Essayez ceci pour résumer votre deuxième diagonale:

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

La boucle interne accède à ces entrées:

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

Et la valeur totale de cette diagonale pour votre exemple de matrice est la suivante:

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

L'erreur dans votre code est d'utiliser la même expression pour les deux dimensions:

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

qui traitera à nouveau la première diagonale en ordre inverse [(2, 2), (1, 1), (0, 0)] en vous donnant la même somme deux fois.

8
mhawke

Utilisez la bibliothèque numpy qui est puissante pour tous les calculs matriciels. Pour votre cas particulier:

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)

Vous pouvez facilement installer numpy avec pip ou d’autres méthodes que vous trouverez sur de nombreux sites Web.

Si vous voulez toutes les diagonales, et pas seulement la diagonale principale, cochez this qui utilise également numpy.

MODIFIER

mhawke, si tu veux calculer antidiagonal (diagonale secondaire), comme expliqué dans wikipedia , tu peux retourner la matrice 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)
13
iblasi

essaye ça:

n=3
sum_second_diagonal=sum([a[i][j] for i in range(n) for j in range(n) if i==j]) #it will add when i==j
1
Binyamin Even
def sum_diagnol():
    import random
    sum=0
    r1=int(input("row"))
    c1=int(input("col"))
    a=[[random.random()for col in range(c1)]for row in range(r1)]
    print("enter elements")
    for i in range(r1):
        for j in range(c1):
            a[i][j]=int(input("enter elements"))
    r2=int(input("row"))
    c2=int(input("col"))
    b=[[random.random()for col in range(c2)]for row in range(r2)]
    print("enter elements")
    for i in range(r2):
        for j in range(c2):
            b[i][j]=int(input("enter elements"))
    c=[[random.random()for col in range(c2)]for row in range(r1)]
    if(c1==r2):
        for i in range(r1):
            for j in range(c2):
                c[i][j]=0
                for k in range(c2):
                    c[i][j]=a[j][k]*b[k][j]
    else:
        print("multiplication not possible")
    for i in range(r1):
        for j in range(c2):
            print(c[i][j],end=" ")
        print()
sum_diagnol()
0
Sathvik Andela

Puisque vous connaissez les positions des éléments diagonaux pour la ligne i, vous pouvez l'écrire de manière assez dense, comme suit:

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

Et, pour les matrices de taille impaire, vous ne devez pas ajouter l'élément central deux fois:

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