我想看看是否有一种更优雅/高效/朱利安的方法来生成一个函数,该函数接受一个可迭代对象和一个整数,并返回可迭代对象与其自身的笛卡尔积或外积指定的次数。 在我看来,理想的方法是生成一个数组数组、一个数组元组或一组数组,但如果这不是正确的方法,那么我想了解原因。我提供了以下功能,在我看来,它看起来过于“高级”。这是我做的:
using Base.Iterators
function ncartprod(ss, n)
argumento=fill(ss, n)
result=collect(product(argumento...))
return(result)
end
该函数返回一个具有奇怪类型的对象:一个由 n 大小的元组组成的 n 维数组...这对于定位元素是有意义的,...但是,然后,我可以简单地逐一生成。
我原来的集合,这里命名为 ss,只是整数数组,如下所示:
ss=[-1,0,1]
所以我可以做这样的事情:
r=ncartprod(ss, 3)
并获得如下内容:
3×3×3 Array{Tuple{Int64,Int64,Int64},3}:
[:, :, 1] =
(-1, -1, -1) (-1, 0, -1) (-1, 1, -1)
(0, -1, -1) (0, 0, -1) (0, 1, -1)
(1, -1, -1) (1, 0, -1) (1, 1, -1)
[:, :, 2] =
(-1, -1, 0) (-1, 0, 0) (-1, 1, 0)
(0, -1, 0) (0, 0, 0) (0, 1, 0)
(1, -1, 0) (1, 0, 0) (1, 1, 0)
[:, :, 3] =
(-1, -1, 1) (-1, 0, 1) (-1, 1, 1)
(0, -1, 1) (0, 0, 1) (0, 1, 1)
(1, -1, 1) (1, 0, 1) (1, 1, 1)
有没有更好、更有效的方法?
最佳答案
tholy 的评论实际上应该是答案,实际上我通过使用这些评论并尝试实现我自己的版本学到了一些东西。所以,这是 @tholy 的评论答案和我一路上发现的一些东西:
result(ss, n) = Iterators.product(ntuple(i->ss, n)...)
速度快得惊人,而且由于不收集产品,因此输出对象在内存中很少。我使用的方法在 RAM 成本方面非常笨重。 看来 Julia 中的迭代器类真的很高效,我不应该尝试列出所有内容,而是在需要时调用我需要的部分。
关于iterator - Julia 中集合的 N 维笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56120583/