Matrix Calculations
Matrix-Vector Product
Matmul
matmul multiplies a rank-2 matrix by a rank-1 vector when their shapes line up.
Program
Play the program to scale a vector before multiplying it by a small matrix.
matrix_vector_product.f90
Replay: real traced execution (multi-file project)
program matrix_vector_product_demo
implicit none
integer :: matrix(2, 2)
integer :: vector(2)
integer :: scale
integer :: result(2)
matrix = reshape([2, 1, 3, 4], [2, 2])
vector = [1, 2]
scale = 1
result = matmul(matrix, vector * scale)
print '(I0, 1X, I0)', result(1), result(2)
end program matrix_vector_product_demo
program matrix_vector_product_demo
implicit none
integer :: matrix(2, 2)
integer :: vector(2)
integer :: scale
integer :: result(2)
matrix = reshape([2, 1, 3, 4], [2, 2])
vector = [1, 2]
scale = 2
result = matmul(matrix, vector * scale)
print '(I0, 1X, I0)', result(1), result(2)
end program matrix_vector_product_demo
program matrix_vector_product_demo
implicit none
integer :: matrix(2, 2)
integer :: vector(2)
integer :: scale
integer :: result(2)
matrix = reshape([2, 1, 3, 4], [2, 2])
vector = [1, 2]
scale = 3
result = matmul(matrix, vector * scale)
print '(I0, 1X, I0)', result(1), result(2)
end program matrix_vector_product_demo
matrix ← [[2, 3], [1, 4]]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]values this step[[2, 3], [1, 4]]matrixvector ← [1, 2]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 1values this step[1, 2]vectorscale ← 1
9vector = [1, 2]10scale = 111result = matmul(matrix, vector * scale)values this step1scaleresult ← [8, 9]
10scale = 111result = matmul(matrix, vector * scale)12print '(I0, 1X, I0)', result(1), result(2)values this step[8, 9]result[[2, 3], [1, 4]]matrix[1, 2]vector * scaleprint '(I0, 1X, I0)', result(1), result(2)
11 result = matmul(matrix, vector * scale)12 print '(I0, 1X, I0)', result(1), result(2)13end program matrix_vector_product_demooutput8 9values this step[8, 9]result
matrix ← [[2, 3], [1, 4]]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]values this step[[2, 3], [1, 4]]matrixvector ← [1, 2]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 2values this step[1, 2]vectorscale ← 2
9vector = [1, 2]10scale = 211result = matmul(matrix, vector * scale)values this step2scaleresult ← [16, 18]
10scale = 211result = matmul(matrix, vector * scale)12print '(I0, 1X, I0)', result(1), result(2)values this step[16, 18]result[[2, 3], [1, 4]]matrix[2, 4]vector * scaleprint '(I0, 1X, I0)', result(1), result(2)
11 result = matmul(matrix, vector * scale)12 print '(I0, 1X, I0)', result(1), result(2)13end program matrix_vector_product_demooutput16 18values this step[16, 18]result
matrix ← [[2, 3], [1, 4]]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]values this step[[2, 3], [1, 4]]matrixvector ← [1, 2]
8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 3values this step[1, 2]vectorscale ← 3
9vector = [1, 2]10scale = 311result = matmul(matrix, vector * scale)values this step3scaleresult ← [24, 27]
10scale = 311result = matmul(matrix, vector * scale)12print '(I0, 1X, I0)', result(1), result(2)values this step[24, 27]result[[2, 3], [1, 4]]matrix[3, 6]vector * scaleprint '(I0, 1X, I0)', result(1), result(2)
11 result = matmul(matrix, vector * scale)12 print '(I0, 1X, I0)', result(1), result(2)13end program matrix_vector_product_demooutput24 27values this step[24, 27]result
matmul
`matmul(matrix, vector)` performs a matrix-vector product.
shape match
The vector length must match the matrix column count.
scaled vector
Whole-array arithmetic can prepare inputs before the matrix calculation.