Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以将广播应用于julia中阵列的子阵列/片_Julia_Broadcast - Fatal编程技术网

可以将广播应用于julia中阵列的子阵列/片

可以将广播应用于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

我希望广播到子阵列(即广播到阵列的片)。这在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{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