【问题标题】:Nested array slicing嵌套数组切片
【发布时间】:2025-12-17 06:55:01
【问题描述】:

假设我有一个向量数组:

""" simple line equation """
function getline(a::Array{Float64,1},b::Array{Float64,1})
    line = Vector[]
    for i=0:0.1:1
        vector = (1-i)a+(i*b)
        push!(line, vector)
    end
    return line
end

此函数返回一个包含 x-y 位置的向量数组

Vector[11]
 > Float64[2]
 > Float64[2]
 > Float64[2]
 > Float64[2]
  .
  .
  .

现在我想分离这些向量的所有 x 和 y 坐标以用 plotyjs 绘制它们。

我已经测试了一些方法,但没有成功! Julia 中实现这一目标的正确方法是什么?

【问题讨论】:

    标签: arrays arraylist julia


    【解决方案1】:

    你可以广播getindex

    xs = getindex.(vv, 1)
    ys = getindex.(vv, 2)
    

    编辑 3:

    或者,使用列表推导:

    xs = [v[1] for v in vv]
    ys = [v[2] for v in vv]
    

    编辑:

    出于性能原因,您应该使用StaticArrays 来表示二维点。例如:

    getline(a,b) = [(1-i)a+(i*b) for i=0:0.1:1] 
    
    p1 = SVector(1.,2.)
    p2 = SVector(3.,4.)
    
    vv = getline(p1,p2)
    

    广播getindex 和列表推导仍然有效,但您也可以将reinterpret 向量作为2×11 矩阵:

    to_matrix{T<:SVector}(a::Vector{T}) = reinterpret(eltype(T), a, (size(T,1), length(a)))
    
    m = to_matrix(vv)
    

    请注意,这不会复制数据。您可以直接使用m 或定义,例如,

    xs = @view m[1,:]
    ys = @view m[2,:]
    

    编辑 2:

    顺便说一句,不限制 getline 函数的参数类型有很多优点,通常是首选。上述版本适用于任何使用标量和加法实现乘法的类型,例如,immutable Point ... end 的可能实现(不过,使其完全通用需要更多工作)。

    【讨论】: