Julia - 组合变化而不是组合

问题描述 投票:0回答:1

我有 3x3 矩阵,它的元素可以有值 -1、0 或 1。我想获得所有可能的变化,因此结果总数(所有 3x3 矩阵)应该是 3^(3*3)=19683 .

结果示例:[[0,-1,-1],[-1,1,0],[0,0,1]]

我尝试使用combinatorics.jl包,但它仅适用于组合,而不是变体。

我知道 19683 个很多,但稍后我会根据某些标准减少数量。

预先感谢您的帮助!

julia combinatorics
1个回答
0
投票

以下函数返回矩阵变化的生成器,如OP中所述:

function variations(size, vals)
    n = prod(size)
    k = length(vals)
    idxs = CartesianIndices(ntuple(i->k, n))
    return Iterators.map(x->reshape(getindex(vals, collect(Tuple(x))), size), idxs)
end

繁重的工作是由

CartesianIndices
完成的,它返回一个遍历张量所有可能索引的迭代器。稍微按摩成所需的形状即可给出答案。

比OP更小的例子可以是:

julia> variations((2,2),[-5,5]) |> collect |> vec
16-element Vector{Matrix{Int64}}:
 [-5 -5; -5 -5]
 [5 -5; -5 -5]
 [-5 -5; 5 -5]
 [5 -5; 5 -5]
 [-5 5; -5 -5]
 [5 5; -5 -5]
 [-5 5; 5 -5]
 [5 5; 5 -5]
 [-5 -5; -5 5]
 [5 -5; -5 5]
 [-5 -5; 5 5]
 [5 -5; 5 5]
 [-5 5; -5 5]
 [5 5; -5 5]
 [-5 5; 5 5]
 [5 5; 5 5]

该方程要求以下迭代器:

variations((3,3),[-1, 0, 1])
© www.soinside.com 2019 - 2024. All rights reserved.