Skip to content

Commit

Permalink
Multiplication for elementary matrices
Browse files Browse the repository at this point in the history
  • Loading branch information
Piotr Gawron committed Aug 27, 2019
1 parent cbccabc commit 7ada1e5
Showing 1 changed file with 21 additions and 22 deletions.
43 changes: 21 additions & 22 deletions elementaryarrays/src/ElementaryArrays.jl
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ function ElementaryArray{T}(idx::NTuple{N, Int}, dims::Vararg{Int}) where {T<:Nu
end

function ElementaryArray(value::T, idx::NTuple{N, Int}, dims::Vararg{Int}) where {T<:Number, N}
ElementaryArray{T, N}(one(T), idx, dims...)
ElementaryArray{T, N}(value, idx, dims...)
end

const ElementaryVector{T} = ElementaryArray{T, 1}
Expand Down Expand Up @@ -150,29 +150,28 @@ end

Base.:*(e::ElementaryArray, a::Number) = Base.:*(a, e)

# for op in (:+, :-)
# @eval begin
# function $op(n::T1, e::ElementaryArray{T2, N}) where {T1<:Number, T2<:Number, N}
# T = promote_type(T1, T2)
# x = zeros(T1, e.dims)
# x[e.idx...] $op= n
# x
# end
# end
# end

# for op in (:+, :-, :*, :/)
# @eval begin
# function $op(e::ElementaryArray{T2, N}, n::T1) where {T1<:Number, T2<:Number, N}
# T = promote_type(T1, T2)
# x = zeros(T1, e.dims)
# x[e.idx...] = $op(1, n)
# x
# end
# end
# end
function Base.:*(e::ElementaryMatrix{T1}, a::AbstractMatrix{T2}) where {T1<:Number, T2<:Number}
T = promote_type(T1, T2)
b = zeros(T, size(e)[1], size(a)[2])
r = e.value * a[e.idx[2],:]
b[e.idx[1], :] = r
b
end

function Base.:*(a::AbstractMatrix{T1}, e::ElementaryMatrix{T2}) where {T1<:Number, T2<:Number}
T = promote_type(T1, T2)
b = zeros(T, size(a)[1], size(e)[2])
r = e.value * a[:,e.idx[1]]
b[:, e.idx[2]] = r
b
end

function Base.:*(e1::ElementaryMatrix{T1}, a::AbstractMatrix{T2}, e2::ElementaryMatrix{T3}) where {T1<:Number, T2<:Number, T3<:Number}
T = promote_type(T1, T2, T3)
b = zeros(T, size(e1)[1], size(e2)[2])
r = e1.value * e1.value * a[e1.idx[2], e2.idx[1]]
ElementaryMatrix{T}(r, (e1.idx[1], e2.idx[2]), size(e1)[1], size(e2)[2])
end

end

0 comments on commit 7ada1e5

Please sign in to comment.