Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Re. partitions()

Why is

julia> collect(partitions(1,2))
0-element Array{Any,1}

returned instead of

2-element Array{Any,1}:
 [0,1]
 [1,0]

and do I really have to

x = collect(partitions(n,m));
y = Array(Int64,length(x),length(x[1]));
for i in 1:length(x)
    for j in 1:length(x[1])
        y[i,j] = x[i][j];
    end
end

to convert the result to a two-dimensional array?

like image 772
Arnfinn Avatar asked Sep 14 '26 03:09

Arnfinn


1 Answers

Here's another approach to your problem that I think is a little simpler, using the Combinatorics.jl library:

multisets(n, k) = map(A -> [sum(A .== i) for i in 1:n],
                      with_replacement_combinations(1:n, k))

This allocates a bunch of memory, but I think your current approach does too. Maybe it would be useful to make a first-class version and add it to Combinatorics.jl.

Examples:

julia> multisets(2, 1)
2-element Array{Array{Int64,1},1}:
 [1,0]
 [0,1]

julia> multisets(3, 5)
21-element Array{Array{Int64,1},1}:
 [5,0,0]
 [4,1,0]
 [4,0,1]
 [3,2,0]
 [3,1,1]
 [3,0,2]
 [2,3,0]
 [2,2,1]
 [2,1,2]
 [2,0,3]
 ⋮      
 [1,2,2]
 [1,1,3]
 [1,0,4]
 [0,5,0]
 [0,4,1]
 [0,3,2]
 [0,2,3]
 [0,1,4]
 [0,0,5]

The argument order is backwards from yours to match mathematical convention. If you prefer the other way, that can easily be changed.

like image 67
Fengyang Wang Avatar answered Sep 16 '26 06:09

Fengyang Wang



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!