Skip to content

Commit ae968e5

Browse files
authored
Add permutedims (#71)
* Add permutedims * v0.7.1
1 parent a584582 commit ae968e5

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "FillArrays"
22
uuid = "1a297f60-69ca-5386-bcde-b61e274b549b"
3-
version = "0.7"
3+
version = "0.7.1"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/fillalgebra.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ vec(a::Zeros{T}) where T = Zeros{T}(length(a))
55
vec(a::Fill{T}) where T = Fill{T}(a.value,length(a))
66

77
## Transpose/Adjoint
8+
# cannot do this for vectors since that would destroy scalar dot product
9+
810

911
transpose(a::Ones{T,2}) where T = Ones{T}(reverse(a.axes))
1012
adjoint(a::Ones{T,2}) where T = Ones{T}(reverse(a.axes))
@@ -13,6 +15,21 @@ adjoint(a::Zeros{T,2}) where T = Zeros{T}(reverse(a.axes))
1315
transpose(a::Fill{T,2}) where T = Fill{T}(transpose(a.value), reverse(a.axes))
1416
adjoint(a::Fill{T,2}) where T = Fill{T}(adjoint(a.value), reverse(a.axes))
1517

18+
fillsimilar(a::Ones{T}, axes) where T = Ones{T}(axes)
19+
fillsimilar(a::Zeros{T}, axes) where T = Zeros{T}(axes)
20+
fillsimilar(a::AbstractFill, axes) = Fill(getindex_value(a), axes)
21+
22+
permutedims(a::AbstractFill{<:Any,1}) = fillsimilar(a, (1, length(a)))
23+
permutedims(a::AbstractFill{<:Any,2}) = fillsimilar(a, reverse(a.axes))
24+
25+
function permutedims(B::AbstractFill, perm)
26+
dimsB = size(B)
27+
ndimsB = length(dimsB)
28+
(ndimsB == length(perm) && isperm(perm)) || throw(ArgumentError("no valid permutation of dimensions"))
29+
dimsP = ntuple(i->dimsB[perm[i]], ndimsB)::typeof(dimsB)
30+
fillsimilar(B, dimsP)
31+
end
32+
1633
## Algebraic identities
1734

1835

test/runtests.jl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,14 +721,26 @@ end
721721
@test sparse(Zeros(4, 2)) == spzeros(4, 2)
722722
end
723723

724-
@testset "Adjoint/Transpose" begin
724+
@testset "Adjoint/Transpose/permutedims" begin
725725
@test Ones{ComplexF64}(5,6)' transpose(Ones{ComplexF64}(5,6)) Ones{ComplexF64}(6,5)
726726
@test Zeros{ComplexF64}(5,6)' transpose(Zeros{ComplexF64}(5,6)) Zeros{ComplexF64}(6,5)
727727
@test Fill(1+im, 5, 6)' Fill(1-im, 6,5)
728728
@test transpose(Fill(1+im, 5, 6)) Fill(1+im, 6,5)
729729
@test Ones(5)' isa Adjoint # Vectors still need special dot product
730730
@test Fill([1+im 2; 3 4; 5 6], 2,3)' == Fill([1+im 2; 3 4; 5 6]', 3,2)
731731
@test transpose(Fill([1+im 2; 3 4; 5 6], 2,3)) == Fill(transpose([1+im 2; 3 4; 5 6]), 3,2)
732+
733+
@test permutedims(Ones(10)) Ones(1,10)
734+
@test permutedims(Zeros(10)) Zeros(1,10)
735+
@test permutedims(Fill(2.0,10)) Fill(2.0,1,10)
736+
@test permutedims(Ones(10,3)) Ones(3,10)
737+
@test permutedims(Zeros(10,3)) Zeros(3,10)
738+
@test permutedims(Fill(2.0,10,3)) Fill(2.0,3,10)
739+
740+
@test permutedims(Ones(2,4,5), [3,2,1]) == permutedims(Array(Ones(2,4,5)), [3,2,1])
741+
@test permutedims(Ones(2,4,5), [3,2,1]) Ones(5,4,2)
742+
@test permutedims(Zeros(2,4,5), [3,2,1]) Zeros(5,4,2)
743+
@test permutedims(Fill(2.0,2,4,5), [3,2,1]) Fill(2.0,5,4,2)
732744
end
733745

734746
@testset "setindex!/fill!" begin

0 commit comments

Comments
 (0)