Size: 3406
Comment:
|
← Revision 9 as of 2025-03-28 03:00:49 ⇥
Size: 4045
Comment: Link
|
Deletions are marked like this. | Additions are marked like this. |
Line 3: | Line 3: |
== Introduction == | '''Matrix multiplication''' is a fundamental operation. |
Line 5: | Line 5: |
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. {{{ ┌ ┐┌ ┐ ┌ ┐ │ 0 0││ 0 0 0│ │ 0 0 0│ │ 0 0││ 0 0 0│ = │ 0 0 0│ │ 0 0│└ ┘ │ 0 0 0│ └ ┘ └ ┘ A x B = C mxn x nxp = mxp }}} A cell in a matrix is expressed as C,,ij,, where `i` is a row index and `j` is a column index. |
<<TableOfContents>> |
Line 27: | Line 11: |
== Multiplication == | == Dimensions == |
Line 29: | Line 13: |
=== Cell-wise === | To multiply '''a matrix by another matrix''' as '''''AB''' = '''C''''', they must have a common dimension. '''''A''''' must be as wide as '''''B''''' is tall, and the product will be as wide as '''''B''''' and as tall as '''''A'''''. Alternatively: '''''A''''' has shape ''m'' rows by ''n'' columns, and '''''B''''' has shape ''n'' rows by ''p'' columns, so the product '''''C''''' will have ''m'' rows and ''p'' columns. |
Line 31: | Line 15: |
In a multiplication of matrices A and B, cell C,,ij,, is solved as (row `i` of A)(column `j` of B). | To multiply '''a matrix by a vector''' as '''''A'''x = y'', the vector can be seen as a matrix with ''n'' rows and 1 column. The product will also have 1 column, i.e. be a vector. |
Line 33: | Line 17: |
Consider the following: | To multiply '''a vector by a matrix''', the vector must be [[LinearAlgebra/MatrixTransposition|transposed]] so that it has ''n'' columns and 1 row. In other words, the multiplication is as ''x^T^'''A''' = y^T^''. Alternatively, the multiplication is as ''('''A'''^T^x)^T^ = y^T^''. For multiplying vectors, see [[LinearAlgebra/VectorMultiplication|vector multiplication]]. ---- == Properties == Matrix multiplication is taking linear combinations of the rows of '''''A''''' according to the columns of '''''B''''', or vice versa. Matrix multiplication is not commutative. |
Line 36: | Line 32: |
┌ ┐┌ ┐ ┌ ┐ │ 1 2││ 1 0│ │ 1 2│ │ 3 4││ 0 1│ = │ 3 4│ └ ┘└ ┘ └ ┘ |
julia> A = [1 2; 0 0; 0 0] 3×2 Matrix{Int64}: 1 2 0 0 0 0 |
Line 41: | Line 38: |
cell (1,1) = (row 1 of A)(column 1 of B) = [1 2][1 0] = (1 * 1) + (2 * 0) = 1 |
julia> B = [1 0 0; 2 0 0] 2×3 Matrix{Int64}: 1 0 0 2 0 0 |
Line 46: | Line 43: |
cell (1,2) = (row 1 of A)(column 2 of B) = [1 2][0 1] = (1 * 0) + (2 * 1) = 2 |
julia> A * B 3×3 Matrix{Int64}: 5 0 0 0 0 0 0 0 0 |
Line 51: | Line 49: |
cell (2,1) = [3 4][1 0] = 3 cell (2,2) = [3 4][0 1] = 4 |
julia> B * A 2×2 Matrix{Int64}: 1 2 2 4 |
Line 62: | Line 59: |
=== Row-wise === | == Cell-wise Computation == |
Line 64: | Line 61: |
In a multiplication of matrices A and B, row `i` of C is a linear combination of the columns of B. | A cell in a matrix is expressed as '''''A''',,ij,,'' where ''i'' is a row index and ''j'' is a column index. Indexing starts at 1. |
Line 66: | Line 63: |
Consider the following: | For '''''C''' = '''AB''''': '''''C''',,ij,,'' can be computed as the [[LinearAlgebra/VectorMultiplication#Dot_Product|dot product]] of row '''''A''',,i,,'' and column '''''B''',,j,,''. Referencing the complete solution above: |
Line 69: | Line 68: |
┌ ┐┌ ┐ ┌ ┐ │ 1 2││ 1 0│ │ 1 2│ │ 3 4││ 0 1│ = │ 3 4│ └ ┘└ ┘ └ ┘ |
julia> A[1, :] 2-element Vector{Int64}: 1 2 |
Line 74: | Line 73: |
row 1 = 1(column 1 of B) + 2(column 2 of B) = 1[1 0] + 2[0 1] = [1 0] + [0 2] = [1 2] |
julia> B[:, 1] 2-element Vector{Int64}: 1 2 |
Line 79: | Line 78: |
row 2 = 3(column 1 of B) 4(column 2 of B) = 3[1 0] + 4[0 1] = [3 0] + [0 4] = [3 4] |
julia> using LinearAlgebra julia> dot(A[1, :], B[:, 1]) 5 |
Line 89: | Line 88: |
=== Column-wise === | == Column-wise Computation == |
Line 91: | Line 90: |
Column '''''C''',,j,,'' is a linear combination of all columns in '''''A''''' taken according to the column '''''B''',,j,,''. | |
Line 92: | Line 92: |
In a multiplication of matrices A and B, column `j` of C is a linear combination of the rows of A. Consider the following: |
Referencing the complete solution above and recall that '''''B''',,1,, = [1 2]'': |
Line 97: | Line 95: |
┌ ┐┌ ┐ ┌ ┐ │ 1 2││ 1 0│ │ 1 2│ │ 3 4││ 0 1│ = │ 3 4│ └ ┘└ ┘ └ ┘ |
C = 1*A + 2*A 1 1 2 |
Line 102: | Line 98: |
column 1 = 1(row 1 of A) + 0(row 2 of A) = 1[1 2] + 0 = [1 2] |
C = 1*[1 0 0] + 2*[2 0 0] 1 |
Line 106: | Line 101: |
column 2 = 0(row 1 of A) + 1(row 2 of A) = 0 + 1[3 4] = [3 4] |
C = [1 0 0] + [4 0 0] 1 C = [5 0 0] 1 |
Line 115: | Line 112: |
=== Summation === | == Row-wise Computation == |
Line 117: | Line 114: |
In a multiplication of matrices A and B, C can be evaluated as a summation of the columns of A by the rows of B. | Row '''''C''',,i,,'' is a linear combination of all rows in '''''B''''' taken according to the row '''''A''',,i,,''. Referencing the complete solution above and recall that '''''A''',,1,, = [1 2]'': |
Line 120: | Line 119: |
┌ ┐┌ ┐ ┌ ┐ │ 1 2││ 1 0│ │ 1 2│ │ 3 4││ 0 1│ = │ 3 4│ └ ┘└ ┘ └ ┘ |
C = 1*B + 2*B 1 1 2 |
Line 125: | Line 122: |
┌ ┐┌ ┐ ┌ ┐┌ ┐ ┌ ┐ │ 1││ 1 0│ │ 2│| 0 1| │ 1 2│ │ 3│└ ┘ + │ 4│└ ┘ = │ 3 4│ └ ┘ └ ┘ └ ┘ |
C = 1*[1 0 0] + 2*[2 0 0] 1 |
Line 130: | Line 125: |
┌ ┐ ┌ ┐ ┌ ┐ | 1 0| | 0 2| │ 1 2│ | 3 0| + | 0 4| = │ 3 4│ └ ┘ └ ┘ └ ┘ |
C = [1 0 0] + [4 0 0] 1 C = [5 0 0] 1 |
Line 140: | Line 136: |
=== Block-wise === | == Block-wise Computation == |
Line 142: | Line 138: |
In a multiplication of matrices A and B, C can be evaluated block-wise. Suppose A and B are 20x20 matrices; they can be divided each into 10x10 quadrants. | Matrix multiplication can be evaluated in blocks. 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: |
Line 145: | Line 143: |
┌ ┐┌ ┐ ┌ ┐ │ A1 A2││ B1 B2│ │ C1 C2│ │ A3 A4││ B3 B4│ = │ C3 C4│ └ ┘└ ┘ └ ┘ |
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 |
Line 151: | Line 154: |
C^1^ = A^1^B^1^ + A^2^B^3^ | 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: {{{ 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 like '''''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
Matrix multiplication is a fundamental operation.
Contents
Dimensions
To multiply a matrix by another matrix as AB = C, they must have a common dimension. A must be as wide as B is tall, and the product will be as wide as B and as tall as A. Alternatively: A has shape m rows by n columns, and B has shape n rows by p columns, so the product C will have m rows and p columns.
To multiply a matrix by a vector as Ax = y, the vector can be seen as a matrix with n rows and 1 column. The product will also have 1 column, i.e. be a vector.
To multiply a vector by a matrix, the vector must be transposed so that it has n columns and 1 row. In other words, the multiplication is as xTA = yT. Alternatively, the multiplication is as (ATx)T = yT.
For multiplying vectors, see vector multiplication.
Properties
Matrix multiplication is taking linear combinations of the rows of A according to the columns of B, or vice versa.
Matrix multiplication is not commutative.
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 julia> B * A 2×2 Matrix{Int64}: 1 2 2 4
Cell-wise Computation
A cell in a matrix is expressed as Aij where i is a row index and j is a column index. Indexing starts at 1.
For C = AB: Cij can be computed as the dot product of row Ai and column Bj.
Referencing the complete solution above:
julia> A[1, :] 2-element Vector{Int64}: 1 2 julia> B[:, 1] 2-element Vector{Int64}: 1 2 julia> using LinearAlgebra julia> dot(A[1, :], B[:, 1]) 5
Column-wise Computation
Column Cj is a linear combination of all columns in A taken according to the column Bj.
Referencing the complete solution above and recall that B1 = [1 2]:
C = 1*A + 2*A 1 1 2 C = 1*[1 0 0] + 2*[2 0 0] 1 C = [1 0 0] + [4 0 0] 1 C = [5 0 0] 1
Row-wise Computation
Row Ci is a linear combination of all rows in B taken according to the row Ai.
Referencing the complete solution above and recall that A1 = [1 2]:
C = 1*B + 2*B 1 1 2 C = 1*[1 0 0] + 2*[2 0 0] 1 C = [1 0 0] + [4 0 0] 1 C = [5 0 0] 1
Block-wise Computation
Matrix multiplication can be evaluated in blocks. 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:
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 like C1 = A1B1 + A2B3.
julia> A1 * B1 + A2 * B3 2×2 Matrix{Int64}: 2 4 6 8