Julia中如何生成n×m数组元素的目标组合网格?
如何生成数组元素的指定网格结构?
我有一个n×m大小的数组A,希望生成其元素的网格,输出结构如下:
B = (A[1,1], A[2,1] A[1,1], A[2,2] ... A[1,1], A[2,m] A[1,2], A[2,1] A[1,2], A[2,2] ... A[1,2], A[2,m] ... A[n,1], A[n,m])
我最初尝试如下代码:
A = [1 5; 2 6; 3 7; 4 8] B = collect(Iterators.product(A))
但得到的结果是:
4×2 Matrix{Tuple{Int64}}: (1,) (5,) (2,) (6,) (3,) (7,) (4,) (8,)
这与我想要的输出不符,请问有什么解决办法?
你用Iterators.product(A)得到单元素元组的原因是,该函数需要传入多个可迭代对象来生成笛卡尔积,只传一个数组时,它会把每个元素当作单独的迭代器,自然生成单元素元组。
根据你描述的输出结构,核心需求是将数组A的第i行所有元素,和第i+1行的所有元素逐一配对,直到最后一行,再补充最后一个元组(A[n,1], A[n,m])。可以用以下代码实现:
A = [1 5; 2 6; 3 7; 4 8] # 初始化空数组存储结果 B = Tuple[] # 遍历每一行,和下一行生成笛卡尔积 for i in 1:size(A, 1)-1 # 生成第i行和第i+1行的笛卡尔积,转成一维后添加到B append!(B, vec(collect(Iterators.product(A[i,:], A[i+1,:])))) end # 添加最后一个指定元组 push!(B, (A[end, 1], A[end, end])) # 如果需要转成元组类型(而非数组),可以用tuple(B...) B_tuple = tuple(B...)
执行后,B_tuple的结构将符合你的需求:
((1, 2), (1, 6), (5, 2), (5, 6), (2, 3), (2, 7), (6, 3), (6, 7), (3, 4), (3, 8), (7, 4), (7, 8), (4, 8))
如果你的真实需求是生成所有元素的两两笛卡尔积(不局限于相邻行),可以直接传入数组A两次给Iterators.product,再转成一维:
B = vec(collect(Iterators.product(A, A)))
这样会得到包含所有(A[i,j], A[k,l])的一维数组,顺序为按列优先遍历。
内容的提问来源于stack exchange,提问作者CeterisPartybus
相关产品推荐
相关产品推荐

