重塑广播的表达方式

Chr*_*kas 7 arrays julia

我想让以下广播表达工作:

J = rand(4,4)
fx1 = rand(2,2)
fx2 = rand(2,2)
@. J[:,1] = fx1 + fx2
Run Code Online (Sandbox Code Playgroud)

我真的想要某种:

@. J[:,1] = vec(fx1 + fx2)
Run Code Online (Sandbox Code Playgroud)

vec说它应该重塑为4x1,但我不想让这个分配.怎么能一般地处理这个问题(即没有对fx进行索引)?

Dan*_*etz 3

另一种可能性是代替vec-ingfx1fx2来重塑 的切片J

Jcol = reshape(view(J,:,1),(2,2))
@. Jcol = fx1 + fx2
Run Code Online (Sandbox Code Playgroud)

不确定效率,但根据周围的算法,它可能会给出更清晰的视角。LLVM 代码看起来足够短,赋值语句也很清晰。

  • 好点子。你可以在这里使用“reshape”——它应该总是返回一个“视图”。事实上,作为最终的排列,我认为你也可以将其表达为“@”。J[重塑(1:4, 2, 2), 1)] = fx1 + fx2`。从理论上讲,它可能具有相同的性能,但我们还没有针对使用重塑范围作为索引进行所有优化,因此目前速度会较慢。 (2认同)