Julia:被映射的函数有多个输入参数的 mapslices()?
Julia: mapslices() where the function being mapped has multiple input arguments?
我正在尝试以一种允许我在多维数组的 'slices' 中广播函数的方式使用 mapslices
(也许这甚至不是正确的方法),其中函数涉及另一个数组,该数组对于广播的每次迭代始终相同。这可以用 mapslices
或 map
来完成吗?
具体问题如下:
我有一个函数 F(X,Y)
,它将二维数组 X
和 Y
作为输入。 X 的大小为 (D, N)
,类型为 Array{Float32,2}
),而 Y 的大小也为 (D, 1)
,类型为 Array{Float32,2}
.
F(X,Y)
对 X
和 Y
两个矩阵执行运算以生成大小为 (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_all
和 Y
的每个切片的结果。所以这个例子中最终的输出形状应该是(N,5)
.
这不适用于 broadcast
(我得到的错误表明 F(X,Y)
正在被馈送标量浮点数,而不是数组),所以我假设它需要完成mapslices
。唯一的问题是我似乎找不到 mapslices
与多个输入参数一起使用的示例(例如 X
和 Y
)——通常我只看到它与一个输入参数一起使用.
有什么想法吗?
你对问题的书面描述对我来说有点难以理解,但如果我正确理解问题,你只需要使用 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
我正在尝试以一种允许我在多维数组的 'slices' 中广播函数的方式使用 mapslices
(也许这甚至不是正确的方法),其中函数涉及另一个数组,该数组对于广播的每次迭代始终相同。这可以用 mapslices
或 map
来完成吗?
具体问题如下:
我有一个函数 F(X,Y)
,它将二维数组 X
和 Y
作为输入。 X 的大小为 (D, N)
,类型为 Array{Float32,2}
),而 Y 的大小也为 (D, 1)
,类型为 Array{Float32,2}
.
F(X,Y)
对 X
和 Y
两个矩阵执行运算以生成大小为 (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_all
和 Y
的每个切片的结果。所以这个例子中最终的输出形状应该是(N,5)
.
这不适用于 broadcast
(我得到的错误表明 F(X,Y)
正在被馈送标量浮点数,而不是数组),所以我假设它需要完成mapslices
。唯一的问题是我似乎找不到 mapslices
与多个输入参数一起使用的示例(例如 X
和 Y
)——通常我只看到它与一个输入参数一起使用.
有什么想法吗?
你对问题的书面描述对我来说有点难以理解,但如果我正确理解问题,你只需要使用 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