可以广播应用于朱莉娅的阵列/切片



我想广播到子阵列(即广播到阵列切片)。这对于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]表示沿着昏暗的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的包装器),包括矢量化,并行,循环,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次,批次。和高级矢量化。Arrayfire具有GFOR(http://arrayfire.org/docs/page_gfor.htm)方法,可以在矩阵切片上运行并行计算,并且通过arrayfire.jl中的广播实现。目前,朱莉娅(Julia)的广播行为元素。我只是想知道它是否可以采取"切片",那么它可以对线性代数函数进行纯净的Julia 3D和4D支持(https://github.com/arrayfire/arrayfire/arrayfire/483)。

当然,循环嵌套的普通嵌套将完成工作。我只是在广播.语法上退出,想知道是否可以扩展。

i think 您正在寻找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的每个切片。昏暗是一个 整数向量指定结肠在此表达式中的位置。
结果沿其余尺寸串联。为了 例如,如果DIM为[1,2],并且A为4维,则f呼叫F a [:,:,i,j]为i和j。

使用setdiff如果要指定要加入的维度而不是在哪个函数上进行连接的维度。

(如果您需要一个多重题材版本,请查看此GIST https://gist.github.com/alexmorley/e585df0d857d857d7c9e4a5af75af75df43d00)

最新更新