Differences between revisions 1 and 6 (spanning 5 versions)
Revision 1 as of 2021-09-14 15:42:01
Size: 1239
Comment:
Revision 6 as of 2023-10-30 18:01:59
Size: 3078
Comment: Made notation consistent
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:

<<TableOfContents>>

----

Line 5: Line 11:
Matrices are multiplied non-commutatively.

The ''m'' rows of matrix A are multiplied by the ''p'' rows of matrix B. Therefore, note that A must be as tall as B is wide.
Matrices are multiplied '''non-commutatively'''. The ''m'' rows of '''''A''''' are multiplied by the ''p'' rows of '''''B'''''. '''''A''''' must be as ''tall'' as '''''B''''' is ''wide''.
Line 10: Line 14:
┌ ┐┌ ┐ ┌ ┐
│ 0 0││ 0 0 0│ │ 0 0 0│
│ 0 0││ 0 0 0│ = │ 0 0 0│
│ 0 0│└ ┘ │ 0 0 0│
└ ┘ └ ┘
julia> A = [1 2
            0 0
            0 0]
3×2 Matrix{Int64}:
 1 2
 0 0
 0 0
Line 16: Line 22:
  A x B = C julia> B = [1 0 0
            2 0 0]
2×3 Matrix{Int64}:
 1 0 0
 2 0 0
Line 18: Line 28:
 mxn x nxp = mxp julia> A * B
3×3 Matrix{Int64}:
 5 0 0
 0 0 0
 0 0 0
Line 21: Line 35:
A cell in a matrix is expressed as C,,ij,, where `i` is a row index and `j` is a column index. A cell in a matrix is expressed as ''c,,ij,,'' where ''i'' is a row index and ''j'' is a column index.

----
Line 25: Line 41:
== Multiplication == == Computation ==
Line 27: Line 43:
In a multiplication of matrices A and B, cell C,,ij,, is solved as (row `i` of A)(column `j` of B).
Line 29: Line 44:
Consider the following:
=== Cell-wise ===

In a multiplication of matrices '''''A''''' and '''''B''''', cell ''c,,ij,,'' of the new matrix '''''C''''' is the [[LinearAlgebra/VectorMultiplication#Dot_Product|dot product]] of row '''''A,,i,,''''' and column '''''B,,j,,'''''.
Line 32: Line 50:
┌ ┐┌ ┐ ┌ ┐
│ 1 2││ 1 0│ │ 1 2│
│ 3 4││ 0 1│ = │ 3 4│
└ ┘└ ┘ └ ┘
julia> [1 2; 3 4] * [1 0; 0 1]
2×2 Matrix{Int64}:
 1 2
 3 4
}}}
Line 37: Line 56:
cell (1,1) = (row 1 of A)(column 1 of B)
           = [1 2][1 0]
           = (1 * 1) + (2 * 0)
           = 1
Line 42: Line 57:
cell (1,2) = (row 1 of A)(column 2 of B)
           = [1 2][0 1]
           = (1 * 0) + (2 * 1)
           = 2
Line 47: Line 58:
cell (2,1) = [3 4][1 0]
           = 3
=== Row-wise ===
Line 50: Line 60:
cell (2,2) = [3 4][0 1]
           = 4
Row ''i'' of '''''C''''' is a linear combination of the columns of '''''B'''''.

Solving for each row as:

{{{
row 1 = 1(column 1 of B) + 2(column 2 of B)
      = 1[1 0] + 2[0 1]
      = [1 0] + [0 2]
      = [1 2]

row 2 = 3(column 1 of B) 4(column 2 of B)
      = 3[1 0] + 4[0 1]
      = [3 0] + [0 4]
      = [3 4]
}}}



=== Column-wise ===

Column ''j'' of '''''C''''' is a linear combination of the rows of '''''A'''''.

Solving for each column as:

{{{
column 1 = 1(row 1 of A) + 0(row 2 of A)
         = 1[1 2] + 0
         = [1 2]

column 2 = 0(row 1 of A) + 1(row 2 of A)
         = 0 + 1[3 4]
         = [3 4]
}}}



=== Summation ===

'''''C''''' can be evaluated as a summation of the columns of '''''A''''' by the rows of '''''B'''''.

{{{
julia> [1; 2] * [1 0]
2×2 Matrix{Int64}:
 1 0
 2 0

julia> [3; 4] * [0 1]
2×2 Matrix{Int64}:
 0 3
 0 4

julia> [1; 2] * [1 0] + [3; 4] * [0 1]
2×2 Matrix{Int64}:
 1 3
 2 4
}}}



=== Block-wise ===

'''''C''''' can be evaluated block-wise. Suppose '''''A''''' and '''''B''''' are 20x20 matrices; they can be divided each into 10x10 quadrants.

Using these matrices '''''A''''' and '''''B''''' as the building blocks:

{{{
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1 2
 3 4

julia> B = [1 0; 0 1]
2×2 Matrix{Int64}:
 1 0
 0 1
}}}

Much larger matrices may be composed of these building blocks.

{{{
julia> A_ = [A1 A2; A3 A4]
4×4 Matrix{Int64}:
 1 2 1 2
 3 4 3 4
 1 2 1 2
 3 4 3 4

julia> B_ = [B1 B2; B3 B4]
4×4 Matrix{Int64}:
 1 0 1 0
 0 1 0 1
 1 0 1 0
 0 1 0 1
}}}

The entire product could be computed, as in:

{{{
julia> A_ * B_
4×4 Matrix{Int64}:
 2 4 2 4
 6 8 6 8
 2 4 2 4
 6 8 6 8
}}}

But if a specific block of the product is of interest, it can be solved as '''''C^1^''''' = '''''A^1^B^1^''''' + '''''A^2^B^3^'''''.

{{{
julia> A1 * B1 + A2 * B3
2×2 Matrix{Int64}:
 2 4
 6 8

Matrix Multiplication


Introduction

Matrices are multiplied non-commutatively. The m rows of A are multiplied by the p rows of B. A must be as tall as B is wide.

julia> A = [1 2
            0 0
            0 0]
3×2 Matrix{Int64}:
 1  2
 0  0
 0  0

julia> B = [1 0 0
            2 0 0]
2×3 Matrix{Int64}:
 1  0  0
 2  0  0

julia> A * B
3×3 Matrix{Int64}:
 5  0  0
 0  0  0
 0  0  0

A cell in a matrix is expressed as cij where i is a row index and j is a column index.


Computation

Cell-wise

In a multiplication of matrices A and B, cell cij of the new matrix C is the dot product of row Ai and column Bj.

julia> [1 2; 3 4] * [1 0; 0 1]
2×2 Matrix{Int64}:
 1  2
 3  4

Row-wise

Row i of C is a linear combination of the columns of B.

Solving for each row as:

row 1 = 1(column 1 of B) + 2(column 2 of B)
      = 1[1 0] + 2[0 1]
      = [1 0] + [0 2]
      = [1 2]

row 2 = 3(column 1 of B) 4(column 2 of B)
      = 3[1 0] + 4[0 1]
      = [3 0] + [0 4]
      = [3 4]

Column-wise

Column j of C is a linear combination of the rows of A.

Solving for each column as:

column 1 = 1(row 1 of A) + 0(row 2 of A)
         = 1[1 2] + 0
         = [1 2]

column 2 = 0(row 1 of A) + 1(row 2 of A)
         = 0 + 1[3 4]
         = [3 4]

Summation

C can be evaluated as a summation of the columns of A by the rows of B.

julia> [1; 2] * [1 0]
2×2 Matrix{Int64}:
 1  0
 2  0

julia> [3; 4] * [0 1]
2×2 Matrix{Int64}:
 0  3
 0  4

julia> [1; 2] * [1 0] + [3; 4] * [0 1]
2×2 Matrix{Int64}:
 1  3
 2  4

Block-wise

C can be evaluated block-wise. Suppose A and B are 20x20 matrices; they can be divided each into 10x10 quadrants.

Using these matrices A and B as the building blocks:

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> B = [1 0; 0 1]
2×2 Matrix{Int64}:
 1  0
 0  1

Much larger matrices may be composed of these building blocks.

julia> A_ = [A1 A2; A3 A4]
4×4 Matrix{Int64}:
 1  2  1  2
 3  4  3  4
 1  2  1  2
 3  4  3  4

julia> B_ = [B1 B2; B3 B4]
4×4 Matrix{Int64}:
 1  0  1  0
 0  1  0  1
 1  0  1  0
 0  1  0  1

The entire product could be computed, as in:

julia> A_ * B_
4×4 Matrix{Int64}:
 2  4  2  4
 6  8  6  8
 2  4  2  4
 6  8  6  8

But if a specific block of the product is of interest, it can be solved as C1 = A1B1 + A2B3.

julia> A1 * B1 + A2 * B3
2×2 Matrix{Int64}:
 2  4
 6  8


CategoryRicottone

LinearAlgebra/MatrixMultiplication (last edited 2025-03-28 03:00:49 by DominicRicottone)