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))
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.
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)
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
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()
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]