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.

scale
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
  1. matrix ← [[2, 3], [1, 4]]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]
    values this step[[2, 3], [1, 4]]matrix
  2. vector ← [1, 2]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 1
    values this step[1, 2]vector
  3. scale ← 1

    9vector = [1, 2]10scale = 111result = matmul(matrix, vector * scale)
    values this step1scale
  4. result ← [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 * scale
  5. print '(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_demo
    output8 9
    values this step[8, 9]result
  1. matrix ← [[2, 3], [1, 4]]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]
    values this step[[2, 3], [1, 4]]matrix
  2. vector ← [1, 2]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 2
    values this step[1, 2]vector
  3. scale ← 2

    9vector = [1, 2]10scale = 211result = matmul(matrix, vector * scale)
    values this step2scale
  4. result ← [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 * scale
  5. print '(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_demo
    output16 18
    values this step[16, 18]result
  1. matrix ← [[2, 3], [1, 4]]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]
    values this step[[2, 3], [1, 4]]matrix
  2. vector ← [1, 2]

    8matrix = reshape([2, 1, 3, 4], [2, 2])9vector = [1, 2]10scale = 3
    values this step[1, 2]vector
  3. scale ← 3

    9vector = [1, 2]10scale = 311result = matmul(matrix, vector * scale)
    values this step3scale
  4. result ← [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 * scale
  5. print '(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_demo
    output24 27
    values 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.