我有 3x3 矩阵,它的元素可以有值 -1、0 或 1。我想获得所有可能的变化,因此结果总数(所有 3x3 矩阵)应该是 3^(3*3)=19683 .
结果示例:[[0,-1,-1],[-1,1,0],[0,0,1]]
我尝试使用combinatorics.jl包,但它仅适用于组合,而不是变体。
我知道 19683 个很多,但稍后我会根据某些标准减少数量。
预先感谢您的帮助!
以下函数返回矩阵变化的生成器,如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])