-
-
Notifications
You must be signed in to change notification settings - Fork 35
Description
Version 1.9.4.
*(A, B::AbstractMatrix, C)
A * B * C * D
Chained multiplication of 3 or 4 matrices is done in the most efficient sequence, based on the sizes of the
arrays. That is, the number of scalar multiplications needed for (A * B) * C (with 3 dense matrices) is
compared to that for A * (B * C) to choose which of these to execute.
If the last factor is a vector, or the first a transposed vector, then it is efficient to deal with these
first. In particular x' * B * y means (x' * B) * y for an ordinary column-major B::Matrix. Unlike dot(x, B,
y), this allocates an intermediate array.
If the first or last factor is a number, this will be fused with the matrix multiplication, using 5-arg mul!.
See also muladd, dot.
│ Julia 1.7
│
│ These optimisations require at least Julia 1.7.
Obviously, this transformation slightly changes results for floating point numbers due to their mild non-associativity. However, it is also applied in contexts with mathematics that are decisively non-associative. For example:
julia> using Octonions
julia> x = Octonion(1,2,3,4,5,6,7,8); y = Octonion(1,-2,3,4,5,6,7,8); z = Octonion(1,2,-3,4,5,6,7,8);
julia> [x;;] * [y;;] * [z;;] # left-associative evaluation
1×1 Matrix{Octonion{Int64}}:
Octonion{Int64}(-652, -1064, 612, -736, -860, -1128, -1036, -1712)
julia> [x;;] * [y;;] * [z;;] * [1;] # trailing vector causes right-associativity
1-element Vector{Octonion{Int64}}:
Octonion{Int64}(-652, -1064, 612, -736, -1148, -888, -1420, -1376)We like to compose packages in Julia. Arbitrary re-assocation is incompatible with this. Since "standard" associativity is undefined, it becomes necessary for a "correct" package to explicitly force every association with parentheses. N-ary evaluation cannot be correctly applied without tight control of the context that ensures re-association is mathematically valid. The presence of re-association in any insufficiently-controlled context (like the above matrix-chain specialization) will lead to correctness issues across the ecosystem.
Spiritually related to JuliaLang/julia#52333.