首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >朱莉娅:有没有办法用一个离散集合中的元素枚举所有大小为m*n的矩阵?

朱莉娅:有没有办法用一个离散集合中的元素枚举所有大小为m*n的矩阵?
EN

Stack Overflow用户
提问于 2019-05-08 12:03:36
回答 2查看 49关注 0票数 1

我正在处理2D网格中的一组两个变量的函数f(x,y)。网格中每个点上的函数本身只能从有限集中取值。我需要枚举我可以构造的所有可能的函数。

特别地,函数被定义为一个矩阵,其中第i个第j个元素告诉我在x_i,y_j处计算的函数的值。

我希望能够创建所有可能的矩阵。我知道这样的矩阵的总数是nf^(nx* ny ),其中nf是函数在一个点上可以接受的值的数量,nx,ny是x和y的网格中的点数。所以,我的测试将使用适度数量的网格点。

谢谢

我试图将问题表达为枚举树中的所有分支并使用递归,但无法创建一个矩阵作为输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-08 12:36:48

这是你想要的吗?

代码语言:javascript
运行
AI代码解释
复制
function funs(fs)
    nf = length(fs)
    @assert length(unique(size.(fs))) == 1
    nx,ny = size(fs[1])
    sigs = Iterators.product(ntuple(i -> 1:nf, nx*ny)...)
    ([fs[sig[i+(j-1)*nx]][nx,ny] for i in 1:nx, j in 1:ny] for sig in sigs)
end

我返回了一个生成器,你可以很容易地迭代它而不需要物化,因为收集它可能会占用太多的内存。当然,对于小数据,您可以对其进行collect,还有一个额外的好处,即它是一个nx*ny维数组,允许您轻松地对不同的维数进行切片。

下面是一个示例:

代码语言:javascript
运行
AI代码解释
复制
julia> fs = [fill(1,2,2), fill(2,2,2), fill(3,2,2)]
3-element Array{Array{Int64,2},1}:
 [1 1; 1 1]
 [2 2; 2 2]
 [3 3; 3 3]

julia> funs(fs)
Base.Generator{Base.Iterators.ProductIterator{NTuple{4,UnitRange{Int64}}},getfield(Main, Symbol("##46#49")){Array{Array{Int64,2},1},Int64,Int64}}(getfield(Main, Symbol("##46#49")){Array{Array{Int64,2},1},Int64,Int64}(Array{Int64,2}[[1 1; 1 1], [2 2; 2 2], [3 3; 3 3]], 2, 2), Base.Iterators.ProductIterator{NTuple{4,UnitRange{Int64}}}((1:3, 1:3, 1:3, 1:3)))

julia> collect(funs(fs))
3×3×3×3 Array{Array{Int64,2},4}:
[:, :, 1, 1] =
 [1 1; 1 1]  [1 1; 2 1]  [1 1; 3 1]
 [2 1; 1 1]  [2 1; 2 1]  [2 1; 3 1]
 [3 1; 1 1]  [3 1; 2 1]  [3 1; 3 1]

[:, :, 2, 1] =
 [1 2; 1 1]  [1 2; 2 1]  [1 2; 3 1]
 [2 2; 1 1]  [2 2; 2 1]  [2 2; 3 1]
 [3 2; 1 1]  [3 2; 2 1]  [3 2; 3 1]

[:, :, 3, 1] =
 [1 3; 1 1]  [1 3; 2 1]  [1 3; 3 1]
 [2 3; 1 1]  [2 3; 2 1]  [2 3; 3 1]
 [3 3; 1 1]  [3 3; 2 1]  [3 3; 3 1]

[:, :, 1, 2] =
 [1 1; 1 2]  [1 1; 2 2]  [1 1; 3 2]
 [2 1; 1 2]  [2 1; 2 2]  [2 1; 3 2]
 [3 1; 1 2]  [3 1; 2 2]  [3 1; 3 2]

[:, :, 2, 2] =
 [1 2; 1 2]  [1 2; 2 2]  [1 2; 3 2]
 [2 2; 1 2]  [2 2; 2 2]  [2 2; 3 2]
 [3 2; 1 2]  [3 2; 2 2]  [3 2; 3 2]

[:, :, 3, 2] =
 [1 3; 1 2]  [1 3; 2 2]  [1 3; 3 2]
 [2 3; 1 2]  [2 3; 2 2]  [2 3; 3 2]
 [3 3; 1 2]  [3 3; 2 2]  [3 3; 3 2]

[:, :, 1, 3] =
 [1 1; 1 3]  [1 1; 2 3]  [1 1; 3 3]
 [2 1; 1 3]  [2 1; 2 3]  [2 1; 3 3]
 [3 1; 1 3]  [3 1; 2 3]  [3 1; 3 3]

[:, :, 2, 3] =
 [1 2; 1 3]  [1 2; 2 3]  [1 2; 3 3]
 [2 2; 1 3]  [2 2; 2 3]  [2 2; 3 3]
 [3 2; 1 3]  [3 2; 2 3]  [3 2; 3 3]

[:, :, 3, 3] =
 [1 3; 1 3]  [1 3; 2 3]  [1 3; 3 3]
 [2 3; 1 3]  [2 3; 2 3]  [2 3; 3 3]
 [3 3; 1 3]  [3 3; 2 3]  [3 3; 3 3]
票数 1
EN

Stack Overflow用户

发布于 2019-06-26 09:54:12

以下是我对OP的理解:

代码语言:javascript
运行
AI代码解释
复制
function all_functions(finite_set, nx, ny)
  I = Iterators.product(fill(finite_set, nx*ny)...)
  (reshape(collect(i), (nx,ny)) for i in I)
end

在行动中:

代码语言:javascript
运行
AI代码解释
复制
julia>fs = (0,1,2,3)
julia>collect(Iterators.take(all_functions(fs, 2, 2), 8))
Array{Int64,2}[[0 0; 0 0], [1 0; 0 0], [2 0; 0 0], [3 0; 0 0], [0 0; 1 0], [1 0; 1 0], [2 0; 1 0], [3 0; 1 0]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56040391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档