重塑广播的表达方式

时间:2017-11-17 07:45:37

标签: arrays julia

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

J = rand(4,4)
fx1 = rand(2,2)
fx2 = rand(2,2)
@. J[:,1] = fx1 + fx2

我真的想要某种:

@. J[:,1] = vec(fx1 + fx2)

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

3 个答案:

答案 0 :(得分:3)

你可以"免除"来自vec宏的@.保护$

julia> expand(:(@. J[:,1] = $vec(fx1) + $vec(fx2)))
:((Base.broadcast!)(+, (Base.dotview)(J, :, 1), (vec)(fx1), (vec)(fx2)))

答案 1 :(得分:3)

另一种可能性是vec而不是fx1而不是fx2J来重塑Jcol = reshape(view(J,:,1),(2,2)) @. Jcol = fx1 + fx2 的切片:

if &term =~ "xterm\\|rxvt"
  let &t_SI .= "\<Esc>[4 q"
  let &t_EI .= "\<Esc>[2 q"
  " 1 or 0 -> blinking block
  " 2 -> solid underscore
  " 3 -> blinking underscore
  " Recent versions of xterm (282 or above) also support
  " 4 -> solid block
  " 5 -> blinking vertical bar
  " 6 -> solid vertical bar
endif

不确定效率,但根据周围的算法,它可能会提供更清晰的视角。 LLVM代码看起来很短,并且赋值语句很清楚。

答案 2 :(得分:2)

由于vecs是视图,因此以下工作:

J = rand(4,4)
fx1 = rand(2,2)
fx2 = rand(2,2)
vfx1,vfx2 = vec(fx1),vec(fx2)
@. J[:,1] = vfx1 + vfx2

我认为没有像我想的那样在一条线上做到这一点,但这很好。

相关问题