可以将广播应用于julia中阵列的子阵列/片
我希望广播到子阵列(即广播到阵列的片)。这在GPU编程中非常有用,例如,我希望:可以将广播应用于julia中阵列的子阵列/片,julia,broadcast,Julia,Broadcast,我希望广播到子阵列(即广播到阵列的片)。这在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和dim 2应用冒号 有没有办法支持这种“子广播” 编辑:添加一个示例 julia> a = reshape(1:8, (2,2,2)) 2×2×2 Base.ReshapedArray{Int
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和dim 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:我正在通过ArrayFire.jl包(ArrayFire的包装)尝试不同的矢量化方法,包括矢量化、循环并行、批处理和高级矢量化。arrayfire使用gfor()方法在矩阵切片上运行并行计算,并通过arrayfire.jl中的广播实现。目前,茱莉亚的广播节目以元素为导向。我只是想知道它是否可以“按片”运行,然后它可以对线性代数函数()提供纯julia 3D和4D支持
当然,正常的嵌套for循环将完成任务。我刚刚对广播
语法感到兴奋,不知道它是否可以扩展。我想您正在寻找映射片
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是一个
整数向量,指定冒号在此表达式中的位置。
结果将沿其余维度连接。对于
例如,如果dims为[1,2]且A为4维,则启用f
A[:,:,i,j]代表所有的i和j
如果要指定要连接的维度而不是应用函数的维度,请使用setdiff
(如果您需要多参数版本,请查看此要点)我想您正在寻找地图切片
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是一个
整数向量,指定冒号在此表达式中的位置。
结果将沿其余维度连接。对于
例如,如果dims为[1,2]且A为4维,则启用f
A[:,:,i,j]代表所有的i和j
如果要指定要连接的维度而不是应用函数的维度,请使用setdiff
(如果您需要多参数版本,请查看本要点)您不清楚您的意思,能否给出一个预期输出的示例?否则,是的,在切片甚至视图上使用广播操作并没有什么特别之处,例如X=[1 2 3;4 5 6];3.+view(X,:,2)
我添加了一个示例,请给出评论。我不清楚您是如何得到这些数字的;想不想展示一下中间步骤,让大家明白你的意思?另外,不要使用a
两次,使用a
和b
来明确你想在哪里行动。目前还不清楚如何将dim
应用于“广播”操作本身,而不是它的任何一个参数。除非您的意思是dim
应该应用于两个参数中的一个(在这种情况下,您需要指定哪一个;矩阵乘法不是对称的)。想想看,也不清楚你所说的“广播矩阵乘法”是什么意思。我添加了一些参考资料,希望能说明清楚。不清楚你的意思,你能给出一个预期输出的例子吗?否则,是的,在切片甚至视图上使用广播操作并没有什么特别之处,例如X=[1 2 3;4 5 6];3.+view(X,:,2)
我添加了一个示例,请给出评论。我不清楚您是如何得到这些数字的;想不想展示一下中间步骤,让大家明白你的意思?另外,不要使用a
两次,使用a
和b
来明确你想在哪里行动。目前还不清楚如何将dim
应用于“广播”操作本身,而不是它的任何一个参数。除非您的意思是dim
应该应用于两个参数中的一个(在这种情况下,您需要指定哪一个;矩阵乘法不是对称的)。想一想,你也不清楚“广播矩阵乘法”是什么意思。我添加了一些参考资料,希望能说明清楚。谢谢,mapslices完成了这项工作,但如果我们有boadcastslices
,那么循环融合和向量化将使它更有效:在大多数情况下(对于a
谢谢的操作,mapslices可以完成这项工作,但是如果我们有boadcastslices
,那么循环融合和矢量化将使其更加高效:在大多数情况下(对于a