You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:20:28