【问题标题】:Can broadcast be applied to subarrays/slices of array in julia可以将广播应用于 julia 中的子数组/数组切片
【发布时间】:2017-12-14 08:02:25
【问题描述】:

我想广播到子数组(即广播到数组切片)。这在 GPU 编程中很有用,例如我想拥有:

X,Y,Z = (rand(3,3,3) for _=1:3)
@.[1,2] X = f(2X^2 + 6X^3 - sqrt(X)) + Y*Z

其中@.[1,2] 表示沿dim 3 广播,即在表达式中将冒号应用于dim 1 和2。

有没有办法支持这种“转播”?

编辑:添加示例

julia> a = reshape(1:8, (2,2,2))
2×2×2 Base.ReshapedArray{Int64,3,UnitRange{Int64},Tuple{}}:
[:, :, 1] =
 1  3
 2  4

[:, :, 2] =
 5  7
 6  8

julia> broadcast(*, a, a)
2×2×2 Array{Int64,3}:
[:, :, 1] =
 1   9
 4  16

[:, :, 2] =
 25  49
 36  64

julia> broadcast(*, a, a, dim=3) # I would like to broadcast the matrix multiplication (batch mode) instead of elementwise multiplication.
2×2×2 Array{Int64,3}:
[:, :, 1] =
  7  15
 10  22

[:, :, 2] =
 67   91
 78  106

编辑 2:我在这里 https://arrayfire.com/introduction-to-vectorization/ 通过 ArrayFire.jl 包(arrayfire 的包装器)尝试不同的矢量化方法,包括矢量化、并行 for 循环、批处理和高级矢量化。 arrayfire 具有 gfor (http://arrayfire.org/docs/page_gfor.htm) 方法来在矩阵切片上运行并行计算,并通过 ArrayFire.jl 中的广播实现。目前,朱莉娅的广播行为元素明智。我只是想知道它是否可以“切片”然后它可以为线性代数函数提供纯 julia 3D 和 4D 支持 (https://github.com/arrayfire/arrayfire/issues/483)。

当然,普通的嵌套 for 循环可以完成工作。我刚刚对广播. 语法感到厌烦,想知道它是否可以扩展。

【问题讨论】:

  • 不清楚你的意思,你能举一个预期输出的例子吗?否则,是的,对切片甚至视图使用广播操作并没有什么特别的,例如X = [1 2 3; 4 5 6]; 3 .+ view(X, :, 2)
  • 我已经添加了一个例子,请评论。
  • 你如何得到这些数字对我来说并不明显;关心显示中间步骤以明确您的意思吗?另外,不要使用a 两次,使用a 和b 来明确你想在哪里行动。而且仍然不清楚dim 将如何应用于“广播”操作本身,而不是它的任何一个论点。除非您的意思是应该将 dim 应用于两个参数之一(在这种情况下,您需要指定哪个参数;矩阵乘法不是对称的)。想一想,您所说的“广播矩阵乘法”也不清楚。
  • 我已经添加了一些参考资料,希望清楚。

标签: julia broadcast


【解决方案1】:

我认为你正在寻找mapslices。

mapslices(x->x*x, a, (1,2))
2×2×2 Array{Int64,3}:
[:, :, 1] =
  7  15
 10  22

[:, :, 2] =
 67   91
 78  106

mapslices(f, A, dims)

使用函数 f 转换数组 A 的给定维度。 f 是 在 A[...,:,...,:,...] 形式的 A 的每个切片上调用。昏暗是一个 整数向量,指定冒号在此表达式中的位置。
结果沿其余维度连接。为了 例如,如果 dims 是 [1,2] 并且 A 是 4 维的,则调用 f A[:,:,i,j] 对于所有 i 和 j。

如果您想指定连接哪个维度而不是应用函数的维度,请使用setdiff。

(如果您需要多参数版本,请查看此要点https://gist.github.com/alexmorley/e585df0d8d857d7c9e4a5af75df43d00)

【讨论】:

  • 谢谢,mapslices 完成了这项工作,但似乎如果我们有 boadcastslices,那么循环融合和矢量化将使其更高效:discourse.julialang.org/t/…
  • 在大多数情况下(对于 a <: AbstractArray{T,N) where T <: Number 的操作),这仍然会很快。
猜你喜欢
  • 2015-05-17
  • 2014-04-06
  • 1970-01-01
  • 2012-11-10
  • 2014-02-04
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2015-02-02
相关资源
最近更新 更多