N-мерное декартово произведение множества в Юлии - PullRequest
1 голос
/ 14 мая 2019

Я хотел бы посмотреть, есть ли более элегантный / эффективный / юлианский способ получения функции, которая принимает итеративное и целое число и возвращает декартово или внешнее произведение итерируемого с самим собой указанное число раз.На мой взгляд, желательным способом было бы создать массив массивов, или набор массивов, или набор массивов, но если это неправильный способ сделать это, то я хотел бы понять, почему.Я пришел со следующей функцией, которая, на мой взгляд, выглядит чрезмерно «на высоком уровне».Вот что я сделал:

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) 

Есть ли более хороший и эффективный способ?

1 Ответ

1 голос
/ 16 мая 2019

Комментарий Толи должен быть ответом, и я действительно научился нескольким вещам, используя комментарии и пытаясь реализовать свою собственную версию.Итак, вот ответ на комментарий @ tholy и некоторые вещи, которые я обнаружил на всем пути:

result(ss, n) = Iterators.product(ntuple(i->ss, n)...)

Это удивительно быстро, и поскольку продукт не собирается, у него выходной объект очень мало в памяти.Подходы, которые я использовал, были удивительно неоправданными в стоимости оперативной памятиКажется, что класс итераторов в Юлии действительно эффективен, и я не должен пытаться перечислить все, а вызывать нужные мне фрагменты, когда они мне нужны.

...