Джулия: mapslices () где отображаемая функция имеет несколько входных аргументов? - PullRequest
2 голосов
/ 14 июля 2020

Я пытаюсь использовать mapslices (возможно, это даже неправильный подход) таким образом, чтобы я мог транслировать функцию по «фрагментам» многомерного массива, где функция включает другой массив, который является всегда одинаково для каждой итерации трансляции. Можно ли это сделать с помощью mapslices или map?

Вот конкретная проблема:

У меня есть функция F(X,Y), которая принимает на вход 2-мерные массивы X и Y. X имеет размер (D, N) и имеет тип = Array{Float32,2}), тогда как Y также имеет размер (D, 1), с типом = Array{Float32,2}.

F(X,Y) выполняет операцию с двумя матрицами X и Y, чтобы получить массив размером (N, 1).

Проблема трансляции / отображения: у меня есть больший 3-D массив X_all, чьи «срезы» (например, матрицы, сложенные длинными третьими Dimension, например X[:,:,1]) являются примерами входных массивов X с размерами (D,N), которые должны быть входами в F(X,Y). И Y всегда константа.

Итак, пример X_all будет иметь форму (D, N, 5), при этом Y по-прежнему будет (D,1), и я хочу, чтобы вывод широковещательной передачи был матрицей в столбце n хранятся результаты применения F к каждому фрагменту X_all и Y. Таким образом, окончательная форма вывода в этом примере должна быть (N,5).

Это не работает с broadcast (ошибка, которую я получаю, предполагает, что F(X,Y) подаются скалярные числа с плавающей запятой, а не массивы) , поэтому я предполагаю, что это нужно сделать с помощью mapslices. Единственная проблема заключается в том, что я не могу найти примеров использования mapslices с несколькими входными аргументами (например, X и Y) - обычно я вижу это только с одним входным аргументом.

Есть мысли?

1 Ответ

2 голосов
/ 14 июля 2020

Мне трудно понять ваше письменное описание проблемы, но если я правильно понимаю проблему, вам просто нужно использовать mapslices с анонимной функцией X -> F(X, Y)

Вот пример :

F(X, Y) = X'*Y 

F(rand(3, 4), rand(3, 1))

#+RESULTS:
: 4×1 Array{Float64,2}:
:  0.2038830017261133
:  0.16952327765859904
:  0.25986519462136687
:  0.18604863369789784
#+BEGIN_SRC jupyter-julia
let D = 3, N = 4
    x_all = randn(D, N, 5)
    Y = randn(D, 1)

    mapslices(X -> F(X, Y), x_all, dims=(1,2))
end

#+RESULTS:
4×1×5 Array{Float64,3}:
[:, :, 1] =
  1.949979259990055
  0.3939816492611507
 -0.8464390217323449
  0.4555254821129745

[:, :, 2] =
  1.6893553574839384
  1.9573396471517739
  1.5358035472026144
 -1.2706780393752082

[:, :, 3] =
  0.999887609119746
  0.32959013947652727
  0.8756560406754215
 -1.0257977117576802

[:, :, 4] =
 -0.2252063989697573
 -0.5968450960471975
 -0.7319338928241739
  0.236534278792568

[:, :, 5] =
 -0.9523913128029378
  0.13537059021324083
  0.9514285829484852
  0.5464547535310538
...