Multiple dispatch can be thought of as a generalization of object-oriented (OO) programming.
In a typical OO language like Python, an object type (class) owns certain methods (functions), and are typically called via
object.method(arg1, arg2)
Depending on the type of object, the runtime system will dispatch to different method definitions.
In Julia, the same call would be "spelled" differently:
method(object, arg1, arg2)
Spelled this way, you should notice something odd about OO programming: why is the first argument so special?
Traditional OO programming corresponds to single dispatch: the runtime chooses method based on the type of the first argument only. Julia implements multiple dispatch: the runtime chooses method based on the types of all the arguments.
A classic example of the need for multiple dispatch is the case of binary math operators. If you compute x * y, the definition of the * function depends upon both the arguments, not just on x.
Julia defines many versions of the * function:
In [6]:
methods(*)
Out[6]:
281 methods for generic function *:- *(x::Bool,y::Bool) at bool.jl:41
- *{T<:Unsigned}(x::Bool,y::T<:Unsigned) at bool.jl:56
- *(x::Bool,z::Complex{T<:Real}) at complex.jl:116
- *(x::Bool,z::Dual{T<:Real}) at /home/juser/.julia/v0.3/DualNumbers/src/dual.jl:137
- *{T<:Number}(x::Bool,y::T<:Number) at bool.jl:52
- *(z::Complex{T<:Real},x::Bool) at complex.jl:117
- *(x::Dual{T<:Real},z::Bool) at /home/juser/.julia/v0.3/DualNumbers/src/dual.jl:138
- *(y::Number,x::Bool) at bool.jl:58
- *{T,S}(A::Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),B::Union(DenseArray{S,2},SubArray{S,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)})) at linalg/matmul.jl:116
- *(A::Union(Symmetric{T},Hermitian{T}),B::Union(Symmetric{T},Hermitian{T})) at linalg/symmetric.jl:35
- *(A::Union(Symmetric{T},Hermitian{T}),B::Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2})) at linalg/symmetric.jl:36
- *(A::Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),B::Union(Symmetric{T},Hermitian{T})) at linalg/symmetric.jl:37
- *{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S<:Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),UpLo,IsUnit}(A::Triangular{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S<:Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),UpLo,IsUnit},B::Triangular{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S<:Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),UpLo,IsUnit}) at linalg/triangular.jl:23
- *(A::Tridiagonal{T},B::Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit}) at linalg/triangular.jl:206
- *{TA,TB,SA<:AbstractArray{T,2},SB<:AbstractArray{T,2},UpLoA,UpLoB,IsUnitA,IsUnitB}(A::Triangular{TA,SA<:AbstractArray{T,2},UpLoA,IsUnitA},B::Triangular{TB,SB<:AbstractArray{T,2},UpLoB,IsUnitB}) at linalg/triangular.jl:209
- *(Da::Diagonal{T},Db::Diagonal{T}) at linalg/diagonal.jl:52
- *(A::Union(Bidiagonal{T},Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit},Diagonal{T},SymTridiagonal{T},Tridiagonal{T}),B::Union(Bidiagonal{T},Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit},Diagonal{T},SymTridiagonal{T},Tridiagonal{T})) at linalg/bidiag.jl:114
- *(a::Union(DataArray{T,1},DataArray{T,2}),b::Union(Array{T,2},Array{T,1})) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:416
- *(a::Union(Array{T,2},Array{T,1}),b::Union(DataArray{T,1},DataArray{T,2})) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:416
- *(a::Union(DataArray{T,1},DataArray{T,2}),b::Union(DataArray{T,1},DataArray{T,2})) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:416
- *{T<:Union(Int16,Int32,Int8)}(x::T<:Union(Int16,Int32,Int8),y::T<:Union(Int16,Int32,Int8)) at int.jl:18
- *{T<:Union(Uint32,Uint8,Uint16)}(x::T<:Union(Uint32,Uint8,Uint16),y::T<:Union(Uint32,Uint8,Uint16)) at int.jl:22
- *(x::Int64,y::Int64) at int.jl:47
- *(x::Uint64,y::Uint64) at int.jl:48
- *(x::Int128,y::Int128) at int.jl:586
- *(x::Uint128,y::Uint128) at int.jl:587
- *(x::Float32,y::Float32) at float.jl:123
- *(x::Float64,y::Float64) at float.jl:124
- *(z::Complex{T<:Real},w::Complex{T<:Real}) at complex.jl:112
- *(x::Real,z::Complex{T<:Real}) at complex.jl:118
- *(z::Complex{T<:Real},x::Real) at complex.jl:119
- *(x::Rational{T<:Integer},y::Rational{T<:Integer}) at rational.jl:118
- *(a::Float16,b::Float16) at float16.jl:132
- *(x::BigInt,y::BigInt) at gmp.jl:195
- *(a::BigInt,b::BigInt,c::BigInt) at gmp.jl:218
- *(a::BigInt,b::BigInt,c::BigInt,d::BigInt) at gmp.jl:224
- *(a::BigInt,b::BigInt,c::BigInt,d::BigInt,e::BigInt) at gmp.jl:231
- *(x::BigInt,c::Union(Uint32,Uint8,Uint16,Uint64)) at gmp.jl:265
- *(c::Union(Uint32,Uint8,Uint16,Uint64),x::BigInt) at gmp.jl:269
- *(x::BigInt,c::Union(Int64,Int16,Int32,Int8)) at gmp.jl:271
- *(c::Union(Int64,Int16,Int32,Int8),x::BigInt) at gmp.jl:275
- *(x::BigFloat,y::BigFloat) at mpfr.jl:149
- *(x::BigFloat,c::Union(Uint32,Uint8,Uint16,Uint64)) at mpfr.jl:156
- *(c::Union(Uint32,Uint8,Uint16,Uint64),x::BigFloat) at mpfr.jl:160
- *(x::BigFloat,c::Union(Int64,Int16,Int32,Int8)) at mpfr.jl:164
- *(c::Union(Int64,Int16,Int32,Int8),x::BigFloat) at mpfr.jl:168
- *(x::BigFloat,c::Union(Float16,Float64,Float32)) at mpfr.jl:172
- *(c::Union(Float16,Float64,Float32),x::BigFloat) at mpfr.jl:176
- *(x::BigFloat,c::BigInt) at mpfr.jl:180
- *(c::BigInt,x::BigFloat) at mpfr.jl:184
- *(a::BigFloat,b::BigFloat,c::BigFloat) at mpfr.jl:255
- *(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat) at mpfr.jl:261
- *(a::BigFloat,b::BigFloat,c::BigFloat,d::BigFloat,e::BigFloat) at mpfr.jl:268
- *(x::MathConst{sym},y::MathConst{sym}) at constants.jl:23
- *{f}(x::Fixed32{f},y::Fixed32{f}) at /home/juser/.julia/v0.3/FixedPointNumbers/src/fixed32.jl:36
- *{T,f}(x::UfixedBase{T,f},y::UfixedBase{T,f}) at /home/juser/.julia/v0.3/FixedPointNumbers/src/ufixed.jl:87
- *(z::Dual{T<:Real},w::Dual{T<:Real}) at /home/juser/.julia/v0.3/DualNumbers/src/dual.jl:140
- *(x::Real,z::Dual{T<:Real}) at /home/juser/.julia/v0.3/DualNumbers/src/dual.jl:141
- *(z::Dual{T<:Real},x::Real) at /home/juser/.julia/v0.3/DualNumbers/src/dual.jl:142
- *{T<:Number}(x::T<:Number,y::T<:Number) at promotion.jl:189
- *(x::Number,y::Number) at promotion.jl:159
- *{T<:Number}(x::T<:Number,D::Diagonal{T}) at linalg/diagonal.jl:49
- *(s::Real,p::Vec2) at graphics.jl:64
- *(s::Real,bb::BoundingBox) at graphics.jl:151
- *{T,f}(n::Integer,::UfixedConstructor{T,f}) at /home/juser/.julia/v0.3/FixedPointNumbers/src/ufixed.jl:30
- *(s::Real,p::Vec2) at /home/juser/.julia/v0.3/Graphics/src/Graphics.jl:64
- *(s::Real,bb::BoundingBox) at /home/juser/.julia/v0.3/Graphics/src/Graphics.jl:151
- *(c::Real,a::AbstractPDMat) at /home/juser/.julia/v0.3/PDMats/src/generics.jl:25
- *(a::FloatingPoint,b::Day) at /home/juser/.julia/v0.3/Gadfly/src/misc.jl:429
- *(a::FloatingPoint,b::Millisecond) at /home/juser/.julia/v0.3/Gadfly/src/misc.jl:431
- *{P<:Period}(x::Real,y::P<:Period) at /home/juser/.julia/v0.3/Dates/src/dates/periods.jl:58
- *(x::Number) at operators.jl:72
- *{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S}(A::Union(DenseArray{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),2},SubArray{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)}),x::Union(DenseArray{S,1},SubArray{S,1,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)})) at linalg/matmul.jl:67
- *(A::SymTridiagonal{T},B::Number) at linalg/tridiag.jl:59
- *(A::Tridiagonal{T},B::Number) at linalg/tridiag.jl:249
- *{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S<:Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),UpLo,IsUnit}(A::Triangular{T<:Union(Complex{Float64},Float64,Float32,Complex{Float32}),S<:Union(SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2}),UpLo,IsUnit},B::Union(SubArray{T,1,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2},DenseArray{T,1})) at linalg/triangular.jl:24
- *{T,S,UpLo,IsUnit}(A::Triangular{T,S,UpLo,IsUnit},x::Number) at linalg/triangular.jl:157
- *{TvA,TiA}(X::Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit},A::SparseMatrixCSC{TvA,TiA}) at linalg/sparse.jl:129
- *{T,S<:AbstractArray{T,2},UpLo,IsUnit}(A::Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit},B::Union(AbstractArray{T,2},AbstractArray{T,1})) at linalg/triangular.jl:210
- *{TA,Tb}(A::Union(QRPackedQ{TA},QRCompactWYQ{TA}),b::Union(DenseArray{Tb,1},SubArray{Tb,1,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)})) at linalg/factorization.jl:277
- *{TA,TB}(A::Union(QRPackedQ{TA},QRCompactWYQ{TA}),B::Union(DenseArray{TB,2},SubArray{TB,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)})) at linalg/factorization.jl:283
- *{TA,TQ,N}(A::Union(DenseArray{TA,N},SubArray{TA,N,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)}),Q::Union(QRPackedQ{TQ},QRCompactWYQ{TQ})) at linalg/factorization.jl:345
- *(W::Woodbury{T},B::Union(SubArray{T,1,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},SubArray{T,2,A<:DenseArray{T,N},I<:(Union(Int64,Range{Int64})...,)},DenseArray{T,2},DenseArray{T,1})) at linalg/woodbury.jl:70
- *{T<:Number}(D::Diagonal{T},x::T<:Number) at linalg/diagonal.jl:50
- *(D::Diagonal{T},V::Array{T,1}) at linalg/diagonal.jl:53
- *(A::Array{T,2},D::Diagonal{T}) at linalg/diagonal.jl:54
- *(D::Diagonal{T},A::Array{T,2}) at linalg/diagonal.jl:55
- *(A::Bidiagonal{T},B::Number) at linalg/bidiag.jl:108
- *{T}(A::Bidiagonal{T},B::AbstractArray{T,1}) at linalg/bidiag.jl:119
- *(B::BitArray{2},J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:68
- *(S::SparseMatrixCSC{Tv,Ti<:Integer},J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:70
- *{T}(G1::Givens{T},G2::Givens{T}) at linalg/givens.jl:197
- *(G::Givens{T},B::BitArray{2}) at linalg/givens.jl:198
- *{TBf,TBi}(G::Givens{T},B::SparseMatrixCSC{TBf,TBi}) at linalg/givens.jl:199
- *(R::Union(Givens{T},Rotation{T}),A::AbstractArray{T,2}) at linalg/givens.jl:200
- *{Tv,Ti}(A::SparseMatrixCSC{Tv,Ti},B::SparseMatrixCSC{Tv,Ti}) at linalg/sparse.jl:143
- *{TvA,TiA,TvB,TiB}(A::SparseMatrixCSC{TvA,TiA},B::SparseMatrixCSC{TvB,TiB}) at linalg/sparse.jl:4
- *{TvA,TiA}(A::SparseMatrixCSC{TvA,TiA},X::BitArray{1}) at linalg/sparse.jl:11
- *{TvA,TiA}(A::SparseMatrixCSC{TvA,TiA},X::BitArray{2}) at linalg/sparse.jl:109
- *{TA,S,Tx}(A::SparseMatrixCSC{TA,S},x::AbstractArray{Tx,1}) at linalg/sparse.jl:32
- *(X::BitArray{1},A::SparseMatrixCSC{Tv,Ti<:Integer}) at linalg/sparse.jl:95
- *{TvA,TiA,TX}(A::SparseMatrixCSC{TvA,TiA},X::AbstractArray{TX,2}) at linalg/sparse.jl:111
- *{TvA,TiA}(X::BitArray{2},A::SparseMatrixCSC{TvA,TiA}) at linalg/sparse.jl:126
- *{TX,TvA,TiA}(X::Tridiagonal{TX},A::SparseMatrixCSC{TvA,TiA}) at linalg/sparse.jl:128
- *(a::DataArray{T,N},b::String) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:290
- *(a::AbstractDataArray{T,N},b::String) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:300
- *(a::DataArray{T,N},b::Number) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:290
- *(a::AbstractDataArray{T,N},b::Number) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:300
- *{T}(v::Vector1{T},m::Matrix1x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix1x1{T},v::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector1{T},m::Matrix1x1{T},vr::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector1{T},m::Matrix1x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix1x2{T},v::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector1{T},m::Matrix1x2{T},vr::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector1{T},m::Matrix1x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix1x3{T},v::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector1{T},m::Matrix1x3{T},vr::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector1{T},m::Matrix1x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix1x4{T},v::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector1{T},m::Matrix1x4{T},vr::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector2{T},m::Matrix2x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix2x1{T},v::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector2{T},m::Matrix2x1{T},vr::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector2{T},m::Matrix2x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix2x2{T},v::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector2{T},m::Matrix2x2{T},vr::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector2{T},m::Matrix2x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix2x3{T},v::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector2{T},m::Matrix2x3{T},vr::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector2{T},m::Matrix2x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix2x4{T},v::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector2{T},m::Matrix2x4{T},vr::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector3{T},m::Matrix3x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix3x1{T},v::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector3{T},m::Matrix3x1{T},vr::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector3{T},m::Matrix3x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix3x2{T},v::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector3{T},m::Matrix3x2{T},vr::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector3{T},m::Matrix3x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix3x3{T},v::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector3{T},m::Matrix3x3{T},vr::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector3{T},m::Matrix3x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix3x4{T},v::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector3{T},m::Matrix3x4{T},vr::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector4{T},m::Matrix4x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix4x1{T},v::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector4{T},m::Matrix4x1{T},vr::Vector1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector4{T},m::Matrix4x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix4x2{T},v::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector4{T},m::Matrix4x2{T},vr::Vector2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector4{T},m::Matrix4x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix4x3{T},v::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector4{T},m::Matrix4x3{T},vr::Vector3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(v::Vector4{T},m::Matrix4x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:398
- *{T}(m::Matrix4x4{T},v::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:412
- *{T}(vl::Vector4{T},m::Matrix4x4{T},vr::Vector4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:423
- *{T}(m1::Matrix1x1{T},m2::Matrix1x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x1{T},m2::Matrix1x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x1{T},m2::Matrix1x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x1{T},m2::Matrix1x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x2{T},m2::Matrix2x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x2{T},m2::Matrix2x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x2{T},m2::Matrix2x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x2{T},m2::Matrix2x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x3{T},m2::Matrix3x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x3{T},m2::Matrix3x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x3{T},m2::Matrix3x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x3{T},m2::Matrix3x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x4{T},m2::Matrix4x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x4{T},m2::Matrix4x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x4{T},m2::Matrix4x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix1x4{T},m2::Matrix4x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x1{T},m2::Matrix1x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x1{T},m2::Matrix1x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x1{T},m2::Matrix1x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x1{T},m2::Matrix1x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x2{T},m2::Matrix2x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x2{T},m2::Matrix2x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x2{T},m2::Matrix2x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x2{T},m2::Matrix2x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x3{T},m2::Matrix3x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x3{T},m2::Matrix3x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x3{T},m2::Matrix3x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x3{T},m2::Matrix3x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x4{T},m2::Matrix4x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x4{T},m2::Matrix4x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x4{T},m2::Matrix4x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix2x4{T},m2::Matrix4x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x1{T},m2::Matrix1x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x1{T},m2::Matrix1x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x1{T},m2::Matrix1x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x1{T},m2::Matrix1x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x2{T},m2::Matrix2x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x2{T},m2::Matrix2x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x2{T},m2::Matrix2x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x2{T},m2::Matrix2x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x3{T},m2::Matrix3x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x3{T},m2::Matrix3x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x3{T},m2::Matrix3x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x3{T},m2::Matrix3x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x4{T},m2::Matrix4x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x4{T},m2::Matrix4x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x4{T},m2::Matrix4x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix3x4{T},m2::Matrix4x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x1{T},m2::Matrix1x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x1{T},m2::Matrix1x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x1{T},m2::Matrix1x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x1{T},m2::Matrix1x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x2{T},m2::Matrix2x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x2{T},m2::Matrix2x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x2{T},m2::Matrix2x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x2{T},m2::Matrix2x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x3{T},m2::Matrix3x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x3{T},m2::Matrix3x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x3{T},m2::Matrix3x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x3{T},m2::Matrix3x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x4{T},m2::Matrix4x1{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x4{T},m2::Matrix4x2{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x4{T},m2::Matrix4x3{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T}(m1::Matrix4x4{T},m2::Matrix4x4{T}) at /home/juser/.julia/v0.3/ImmutableArrays/src/generate_arrays.jl:470
- *{T<:Number}(x::AbstractArray{T<:Number,N}) at abstractarray.jl:363
- *(B::Number,A::SymTridiagonal{T}) at linalg/tridiag.jl:60
- *(B::Number,A::Tridiagonal{T}) at linalg/tridiag.jl:250
- *{T,S,UpLo,IsUnit}(x::Number,A::Triangular{T,S,UpLo,IsUnit}) at linalg/triangular.jl:167
- *(B::Number,A::Bidiagonal{T}) at linalg/bidiag.jl:109
- *(b::Number,a::DataArray{T,N}) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:290
- *(b::Number,a::AbstractDataArray{T,N}) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:300
- *(A::Number,B::AbstractArray{T,N}) at abstractarray.jl:367
- *(A::AbstractArray{T,N},B::Number) at abstractarray.jl:368
- *(s::String...) at string.jl:76
- *{T,S<:AbstractArray{T,2},UpLo,IsUnit}(A::AbstractArray{T,2},B::Triangular{T,S<:AbstractArray{T,2},UpLo,IsUnit}) at linalg/triangular.jl:211
- *{TX,TvA,TiA}(X::AbstractArray{TX,2},A::SparseMatrixCSC{TvA,TiA}) at linalg/sparse.jl:131
- *{T,S}(A::AbstractArray{T,2},x::AbstractArray{S,1}) at linalg/matmul.jl:71
- *{T1,T2}(X::AbstractArray{T1,1},A::SparseMatrixCSC{T2,Ti<:Integer}) at linalg/sparse.jl:99
- *(A::AbstractArray{T,1},B::AbstractArray{T,2}) at linalg/matmul.jl:74
- *(J1::UniformScaling{T<:Number},J2::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:67
- *(J::UniformScaling{T<:Number},B::BitArray{2}) at linalg/uniformscaling.jl:69
- *{Tv,Ti}(J::UniformScaling{T<:Number},S::SparseMatrixCSC{Tv,Ti}) at linalg/uniformscaling.jl:71
- *(A::AbstractArray{T,2},J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:72
- *(J::UniformScaling{T<:Number},A::Union(AbstractArray{T,2},AbstractArray{T,1})) at linalg/uniformscaling.jl:73
- *(x::Number,J::UniformScaling{T<:Number}) at linalg/uniformscaling.jl:75
- *(J::UniformScaling{T<:Number},x::Number) at linalg/uniformscaling.jl:76
- *{Tv<:Float64}(A::CholmodSparse{Tv<:Float64,Int32},B::CholmodSparse{Tv<:Float64,Int32}) at linalg/cholmod.jl:496
- *{Tv<:Float64}(A::CholmodSparse{Tv<:Float64,Int64},B::CholmodSparse{Tv<:Float64,Int64}) at linalg/cholmod.jl:496
- *{Tv<:Union(Complex{Float64},Float64)}(A::CholmodSparse{Tv<:Union(Complex{Float64},Float64),Ti<:Union(Int64,Int32)},B::CholmodDense{Tv<:Union(Complex{Float64},Float64)}) at linalg/cholmod.jl:870
- *{Tv<:Union(Complex{Float64},Float64)}(A::CholmodSparse{Tv<:Union(Complex{Float64},Float64),Ti<:Union(Int64,Int32)},B::Union(Array{Tv<:Union(Complex{Float64},Float64),1},Array{Tv<:Union(Complex{Float64},Float64),2})) at linalg/cholmod.jl:871
- *(p::Vec2,s::Real) at graphics.jl:62
- *(bb::BoundingBox,s::Real) at graphics.jl:147
- *(p::Vec2,s::Real) at /home/juser/.julia/v0.3/Graphics/src/Graphics.jl:62
- *(bb::BoundingBox,s::Real) at /home/juser/.julia/v0.3/Graphics/src/Graphics.jl:147
- *(c::Number,a::XYZ{T<:Union(FloatingPoint,FixedPoint)}) at /home/juser/.julia/v0.3/Color/src/colorspaces.jl:334
- *{T<:ColorValue{T}}(c::Number,a::T<:ColorValue{T}) at /home/juser/.julia/v0.3/Color/src/colorspaces.jl:338
- *(a::MeasureNil,b::MeasureNil) at /home/juser/.julia/v0.3/Compose/src/measure.jl:190
- *(a::MeasureNil,b) at /home/juser/.julia/v0.3/Compose/src/measure.jl:191
- *(d::NAtype) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:373
- *(a,b::MeasureNil) at /home/juser/.julia/v0.3/Compose/src/measure.jl:192
- *(a::Measure{S,T},b::Measure{S,T}) at /home/juser/.julia/v0.3/Compose/src/measure.jl:218
- *(a::Measure{S,T},b::Number) at /home/juser/.julia/v0.3/Compose/src/measure.jl:295
- *(a::Number,b::Measure{S,T}) at /home/juser/.julia/v0.3/Compose/src/measure.jl:299
- *(::NAtype,::NAtype) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:681
- *(d::NAtype,x::Number) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:682
- *(x::Number,d::NAtype) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:682
- *{T,N}(::NAtype,b::AbstractArray{T,N}) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:758
- *{T,N}(b::AbstractArray{T,N},::NAtype) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:758
- *(b::String,a::DataArray{T,N}) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:290
- *(b::String,a::AbstractDataArray{T,N}) at /home/juser/.julia/v0.3/DataArrays/src/operators.jl:300
- *(a::PDMat,c::Float64) at /home/juser/.julia/v0.3/PDMats/src/pdmat.jl:38
- *(a::PDMat,x::Union(DenseArray{T,2},DenseArray{T,1})) at /home/juser/.julia/v0.3/PDMats/src/pdmat.jl:39
- *(a::PDiagMat,c::Float64) at /home/juser/.julia/v0.3/PDMats/src/pdiagmat.jl:36
- *(a::PDiagMat,x::Union(DenseArray{T,2},DenseArray{T,1})) at /home/juser/.julia/v0.3/PDMats/src/pdiagmat.jl:37
- *(a::ScalMat,c::Float64) at /home/juser/.julia/v0.3/PDMats/src/scalmat.jl:32
- *(a::ScalMat,x::Union(DenseArray{T,2},DenseArray{T,1})) at /home/juser/.julia/v0.3/PDMats/src/scalmat.jl:34
- *(a::AbstractPDMat,c::Real) at /home/juser/.julia/v0.3/PDMats/src/generics.jl:24
- *{P<:Period}(x::P<:Period,y::P<:Period) at /home/juser/.julia/v0.3/Dates/src/dates/periods.jl:55
- *(a::Day,b::FloatingPoint) at /home/juser/.julia/v0.3/Gadfly/src/misc.jl:430
- *(a::Millisecond,b::FloatingPoint) at /home/juser/.julia/v0.3/Gadfly/src/misc.jl:432
- *{P<:Period}(x::P<:Period,y::Real) at /home/juser/.julia/v0.3/Dates/src/dates/periods.jl:57
- *(x::Instant,y::Instant) at /home/juser/.julia/v0.3/Dates/src/dates/arithmetic.jl:3
- *(x::TimeType,y::TimeType) at /home/juser/.julia/v0.3/Dates/src/dates/arithmetic.jl:10
- *(a,b,c) at operators.jl:82
- *(a,b,c,xs...) at operators.jl:83
We can add new methods to a given function at any time. The methods don't "belong" to a particular type, and aren't part of the type's definition.
For example, string concatenation in Julia is done via *:
In [7]:
"hello" * "world"
Out[7]:
"helloworld"
In [8]:
"hello" + "world"
Out[8]:
"hello world"
But we can easily extend + to support a concatenation for strings, if we want:
In [9]:
import Base.+ # we must import a method to add methods (as opposed to replacing it)
+(x::String, y::String) = x * " " * y
Out[9]:
+ (generic function with 218 methods)
In [10]:
"hello" + "world"
Out[10]:
"hello world"
This may look a lot like function overloading in languages like C++. The difference is that C++'s overloading is static (= dispatch at compile-time), whereas Julia's overloading is dynamic (= dispatch at run-time), like OO polymorphism.
For example, now that we've defined +, we can use strings with any previously defined function that requires a + operation, like sum (summation):
In [11]:
sum(["The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog."])
Out[11]:
"The quick brown fox jumped over the lazy dog."
Type declarations are not required for performance — Julia automatically specializes a function on its argument types during compilation. They act like filters, allowing us to specify which functions are used when.
Without this, in a language like Python, you sometimes have to write manual function filters like this example from Matplotlib's quiver.py:
def _parse_args(*args):
X, Y, U, V, C = [None] * 5
args = list(args)
# The use of atleast_1d allows for handling scalar arguments while also
# keeping masked arrays
if len(args) == 3 or len(args) == 5:
C = np.atleast_1d(args.pop(-1))
V = np.atleast_1d(args.pop(-1))
U = np.atleast_1d(args.pop(-1))
if U.ndim == 1:
nr, nc = 1, U.shape[0]
else:
nr, nc = U.shape
if len(args) == 2: # remaining after removing U,V,C
X, Y = [np.array(a).ravel() for a in args]
if len(X) == nc and len(Y) == nr:
X, Y = [a.ravel() for a in np.meshgrid(X, Y)]
else:
indexgrid = np.meshgrid(np.arange(nc), np.arange(nr))
X, Y = [np.ravel(a) for a in indexgrid]
return X, Y, U, V, C
In Julia, you could define different methods for differing numbers of arguments, arrays vs. scalars, etcetera (all eventually calling a single lower-level function to do the work once the arguments have been transformed).
Content source: mr-justin/JuliaBox
Similar notebooks: