我想广播到子阵列(即广播到阵列切片)。这对于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)