gpt4 book ai didi

julia - 将向量分量分配给 Julia 中的不同变量

转载 作者:行者123 更新时间:2023-12-01 13:31:49 25 4
gpt4 key购买 nike

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

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

这可能吗?谢谢。

最佳答案

您正在寻找“矢量 View 串联”。这里的想法是使用 SubArrays构建一个实际上是两个数组的 View 的数组。 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 允许您构建自己的 View 串联类型。构建它所需的工作量与您希望它的通用程度成正比。这是使用向量的第一次尝试:

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

关于julia - 将向量分量分配给 Julia 中的不同变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50864601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com