我想让以下广播表达工作:
J = rand(4,4)
fx1 = rand(2,2)
fx2 = rand(2,2)
@. J[:,1] = fx1 + fx2
我真的想要某种:
@. J[:,1] = vec(fx1 + fx2)
这个vec
说它应该重塑为4x1,但我不想让这个分配。怎么能一般地处理这个问题(即没有对fx进行索引)?
答案 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
而不是fx2
和J
来重塑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
我认为没有像我想的那样在一条线上做到这一点,但这很好。