Я хотел бы посмотреть, есть ли более элегантный / эффективный / юлианский способ получения функции, которая принимает итеративное и целое число и возвращает декартово или внешнее произведение итерируемого с самим собой указанное число раз.На мой взгляд, желательным способом было бы создать массив массивов, или набор массивов, или набор массивов, но если это неправильный способ сделать это, то я хотел бы понять, почему.Я пришел со следующей функцией, которая, на мой взгляд, выглядит чрезмерно «на высоком уровне».Вот что я сделал:
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)
Есть ли более хороший и эффективный способ?