Учитывая p
векторов x1,x2,...,xp
каждый размерностей d
, что это лучший способ, чтобы вычислить их тензорный/внешнее произведение/Kruskal (в p
-array X с элементами X[i1,i2,..ip] = x1[i1]x2[i2]...xp[ip])
? Looping тривиально, но глупо. Использование повторено звонки outer
работает нормально, но не кажется оптимальным решением (и будет работать медленнее, как с ростом р, очевидно) есть ли лучший способOuter/тензорное произведение в R
Edit:.?
Мой текущий лучшее
array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))
, которые по крайней мере, "чувствует себя лучше" ...
Edit 2: В ответ на @Dwin, вот полный пример
d=3
x1 = 1:d
x2 = 1:d+3
x3 = 1:d+6
array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))
, , 1
[,1] [,2] [,3]
[1,] 28 35 42
[2,] 56 70 84
[3,] 84 105 126
, , 2
[,1] [,2] [,3]
[1,] 32 40 48
[2,] 64 80 96
[3,] 96 120 144
, , 3
[,1] [,2] [,3]
[1,] 36 45 54
[2,] 72 90 108
[3,] 108 135 162
Это может ответить на ваш вопрос - http://stackoverflow.com/questions/6192848/how-to-generalize-outer-to-n-dimensions/6193836#6193836 –
Принятый ответ довольно медленный; он кажется медленнее, чем повторные призывы к внешним (неудивительно, учитывая, насколько это вообще). Но я думаю, может быть, второй может быть адаптирован ... – MMM
Я был бы очень удивлен, если бы решение 'expand.grid' было быстрее, чем' external'. –