2016-02-07 30 views
8

Tôi đang cố gắng tìm tổng các phần tử đường chéo trong ma trận. Ở đây, n là kích thước của ma trận vuông và a là ma trận. Ai đó có thể giải thích điều này cho tôi những gì đang xảy ra ở đây.Tổng các phần tử đường chéo trong ma trận

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

Bạn đang tổng hợp cùng một đường chéo hai lần, một lần từ trên trái sang góc dưới bên phải và sau đó là cách khác. Tôi không tin rằng đoạn mã này có thể in bất kỳ thứ gì khác ngoài '4 4' trên bất kỳ cài đặt Python nào. –

Trả lời

4

Hãy thử điều này để tổng hợp đường chéo thứ hai của bạn:

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

Các vòng lặp bên trong truy cập các mục:

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

Và giá trị tổng hợp của đường chéo này cho ma trận mẫu của bạn là:

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

Sai lầm trong mã của bạn là sử dụng các biểu hiện tương tự cho cả hai khía cạnh:

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

mà sẽ xử lý đường chéo đầu tiên một lần nữa theo thứ tự ngược [(2, 2), (1, 1), (0, 0)] đem lại cho bạn số tiền tương tự hai lần.

6

Sử dụng thư viện gọn gàng, mạnh mẽ cho mọi phép tính ma trận. Đối với trường hợp cụ thể của bạn:

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) 

Bạn có thể dễ dàng cài đặt gọn gàng với pip hoặc các cách khác mà bạn sẽ tìm thấy trên nhiều trang web.

Nếu bạn muốn tất cả các đường chéo, và không chỉ là đường chéo chính, hãy kiểm tra this cũng sử dụng gọn gàng.

EDIT

mhawke, nếu bạn muốn tính antidiagonal (thứ cấp đường chéo), như được giải thích trong wikipedia, bạn có thể lật các ma trận trong 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

Tôi nghĩ rằng OP không thể sử dụng 'numpy' vì họ đang gửi mã của họ cho một thẩm phán trực tuyến mà không cho phép' numpy'. Đường chéo thứ hai được tính như thế nào? – mhawke

0

thử điều này:

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

Vì bạn biết vị trí của các phần tử đường chéo cho hàng i, bạn có thể viết nó te đông như:

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

Và, đối với ma trận có kích thước lẻ, bạn không nên thêm các yếu tố trung tâm hai lần:

if len(a)%2: 
    centre = len(a)//2 
    d -= a[centre][centre] 
Các vấn đề liên quan