iterator - Julia 中集合的 N 维笛卡尔积

标签 iterator julia combinatorics cartesian-product

我想看看是否有一种更优雅/高效/朱利安的方法来生成一个函数,该函数接受一个可迭代对象和一个整数,并返回可迭代对象与其自身的笛卡尔积或外积指定的次数。 在我看来,理想的方法是生成一个数组数组、一个数组元组或一组数组,但如果这不是正确的方法,那么我想了解原因。我提供了以下功能,在我看来,它看起来过于“高级”。这是我做的:

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/

相关文章:

loops - Rust 中迭代器的嵌套循环

ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组?

julia - 在不使用 `--depwarn=no` 或包的情况下抑制 Julia 0.6 中的弃用警告

algorithm - 给出组合时如何计算索引(字典顺序)

Java 显式迭代器有效。隐式 forloop 产生 "Can only iterate over an array or an instance of java.lang.Iterable"

c++ - 不在调整大小的 vector 中使用迭代器

c++ - 从所有组合的假设列表中获取索引排列的算法?

javascript - 将带有普通对象数组的普通对象展开为平面普通对象

image-processing - 如何在 Julia 中将一些计算值(浮点)转换为 RGB 类型?

julia - 预编译 StatsPlots.jl 失败