Matrix Calculations
Matrix Diagonal Sum
Indexed Loop
The same index can select matching row and column positions on a matrix diagonal.
Program
Play the program to choose how many diagonal cells are included in the total.
matrix_diagonal_sum.f90
Replay: real traced execution (multi-file project)
program matrix_diagonal_sum_demo
implicit none
integer :: matrix(3, 3)
integer :: diagonal_count
integer :: i
integer :: total
matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])
diagonal_count = 3
total = 0
do i = 1, diagonal_count
total = total + matrix(i, i)
end do
print '(I0, 1X, I0)', diagonal_count, total
end program matrix_diagonal_sum_demo
program matrix_diagonal_sum_demo
implicit none
integer :: matrix(3, 3)
integer :: diagonal_count
integer :: i
integer :: total
matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])
diagonal_count = 1
total = 0
do i = 1, diagonal_count
total = total + matrix(i, i)
end do
print '(I0, 1X, I0)', diagonal_count, total
end program matrix_diagonal_sum_demo
program matrix_diagonal_sum_demo
implicit none
integer :: matrix(3, 3)
integer :: diagonal_count
integer :: i
integer :: total
matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])
diagonal_count = 2
total = 0
do i = 1, diagonal_count
total = total + matrix(i, i)
end do
print '(I0, 1X, I0)', diagonal_count, total
end program matrix_diagonal_sum_demo
matrix ← [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 3values this step[[1, 2, 3], [4, 5, 6], [7, 8, 9]]matrixdiagonal_count ← 3
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 310total = 0values this step3diagonal_counttotal ← 0
9diagonal_count = 310total = 011do i = 1, diagonal_countvalues this step0totali ← 1
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step1itotal ← 1
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step0 → 1total1matrix(1,1)i ← 2
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step2itotal ← 6
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step1 → 6total5matrix(2,2)i ← 3
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step3itotal ← 15
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step6 → 15total9matrix(3,3)print '(I0, 1X, I0)', diagonal_count, total
13 end do14 print '(I0, 1X, I0)', diagonal_count, total15end program matrix_diagonal_sum_demooutput3 15values this step3diagonal_count15total
matrix ← [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 1values this step[[1, 2, 3], [4, 5, 6], [7, 8, 9]]matrixdiagonal_count ← 1
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 110total = 0values this step1diagonal_counttotal ← 0
9diagonal_count = 110total = 011do i = 1, diagonal_countvalues this step0totali ← 1
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step1itotal ← 1
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step0 → 1total1matrix(1,1)print '(I0, 1X, I0)', diagonal_count, total
13 end do14 print '(I0, 1X, I0)', diagonal_count, total15end program matrix_diagonal_sum_demooutput1 1values this step1diagonal_count1total
matrix ← [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 2values this step[[1, 2, 3], [4, 5, 6], [7, 8, 9]]matrixdiagonal_count ← 2
8matrix = reshape([1, 4, 7, 2, 5, 8, 3, 6, 9], [3, 3])9diagonal_count = 210total = 0values this step2diagonal_counttotal ← 0
9diagonal_count = 210total = 011do i = 1, diagonal_countvalues this step0totali ← 1
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step1itotal ← 1
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step0 → 1total1matrix(1,1)i ← 2
10total = 011do i = 1, diagonal_count12 total = total + matrix(i, i)values this step2itotal ← 6
11do i = 1, diagonal_count12 total = total + matrix(i, i)13end dovalues this step1 → 6total5matrix(2,2)print '(I0, 1X, I0)', diagonal_count, total
13 end do14 print '(I0, 1X, I0)', diagonal_count, total15end program matrix_diagonal_sum_demooutput2 6values this step2diagonal_count6total
two indexes
`matrix(i, i)` reads one row and one column with the same index.
diagonal
The main diagonal contains positions `(1,1)`, `(2,2)`, and `(3,3)`.
loop bound
Changing the loop bound changes how much of the diagonal is included.