Julia:被映射的函数有多个输入参数的 mapslices()?

Julia: mapslices() where the function being mapped has multiple input arguments?

我正在尝试以一种允许我在多维数组的 'slices' 中广播函数的方式使用 mapslices(也许这甚至不是正确的方法),其中函数涉及另一个数组,该数组对于广播的每次迭代始终相同。这可以用 mapslicesmap 来完成吗?

具体问题如下:

我有一个函数 F(X,Y),它将二维数组 XY 作为输入。 X 的大小为 (D, N),类型为 Array{Float32,2}),而 Y 的大小也为 (D, 1),类型为 Array{Float32,2}.

F(X,Y)XY 两个矩阵执行运算以生成大小为 (N, 1).

的数组输出

broadcasting/mapping 问题:我有一个更大的三维数组 X_all,其中的 'slices'(例如,矩阵堆叠在第三个维度上,如 X[:,:,1])就是示例输入数组 X 的维度 (D,N),应该是 F(X,Y) 的输入。并且 Y 始终不变。

所以一个例子 X_all 的形状是 (D, N, 5)Y 仍然是 (D,1),我希望广播的输出是一个矩阵,其columsn 存储将 F 应用于 X_allY 的每个切片的结果。所以这个例子中最终的输出形状应该是(N,5).

这不适用于 broadcast(我得到的错误表明 F(X,Y) 正在被馈送标量浮点数,而不是数组),所以我假设它需要完成mapslices。唯一的问题是我似乎找不到 mapslices 与多个输入参数一起使用的示例(例如 XY)——通常我只看到它与一个输入参数一起使用.

有什么想法吗?

你对问题的书面描述对我来说有点难以理解,但如果我正确理解问题,你只需要使用 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