将矢量分量分配给Julia中的不同变量

时间:2018-06-14 19:29:40

标签: julia

我想将操作的结果分配给Julia中的变量串联。与此类似的东西(虽然这不起作用):

a = zeros(5)
b = zeros(5)
a, b .= rand(10)

有可能吗?谢谢。

2 个答案:

答案 0 :(得分:3)

您正在寻找“矢量视图连接”。这里的想法是使用SubArrays来构建一个实际上是两个数组视图的数组。 Julia不支持开箱即用。 Julia软件包ChainedVectors.jl是为此而构建的,但它已经过时且仅适用于Julia< = 0.4。

并非一切都丢失。您有两种选择:

使用CatViews.jl

正如评论中所指出的,CatViews.jl与ChainedVectors.jl类似,但与Julia 0.6和0.7一起使用:

Pkg.add("CatViews")
using CatViews

a = zeros(2)
b = zeros(2)
CatView(a, b) .= rand(4)

构建自己的解决方案

通过一点点工作,我们可以达到

a = zeros(2)
b = zeros(2)
MyView(a, b) .= rand(4)

Julia允许您构建自己的视图连接类型。构建它所需的工作量与你想要它的一般程度成正比。这是第一次使用向量的尝试:

julia> # Create a type for a view into two vectors.

julia> type MyView{T} <: AbstractVector{T}
       a::Vector{T}
       b:: Vector{T}
       end

julia> import Base: size, getindex, setindex!

julia> # Define methods to make MyView behave properly.

julia> size(c::MyView) = size(c.a) .+ size(c.b)

julia> getindex(c::MyView, i::Int) = i <= length(c.a) ? getindex(a, i) : getindex(b, i-length(a))

julia> setindex!(c::MyView, val, i::CartesianIndex) = i[1] <= length(c.a) ? setindex!(c.a, val, i[1]) : setindex!(c.b, val, i[1]-length(a))

julia> setindex!(c::MyView, val, i::Int) = i <= length(c.a) ? setindex!(c.a, val, i) : setindex!(c.b, val, i-length(a))

julia> # Test MyView. Define two arrays and put them
julia> # into a single view.

julia> a = rand(2)
2-element Array{Float64,1}:
 0.701867
 0.543514

julia> b = rand(2)
2-element Array{Float64,1}:
 0.00355893
 0.405809  

julia> MyView(a, b) .= rand(4)
4-element MyView{Float64}:
 0.922896
 0.969057
 0.586866
 0.457117

julia> # Hooray, it worked! As we see below,
julia> # the individual arrays were updated.

julia> a
2-element Array{Float64,1}:
 0.922896
 0.969057

julia> b
2-element Array{Float64,1}:
 0.586866
 0.457117

答案 1 :(得分:2)

此?

{{1}}

你必须告诉朱莉娅以某种方式拆分矢量。