Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 如何最好地表示点列表_Julia - Fatal编程技术网

Julia 如何最好地表示点列表

Julia 如何最好地表示点列表,julia,Julia,我在2D空间中有一组点,表示为秩2数组: points = [0 0; 0 1; 1 0] 它是一种有用的表示法,因为它允许轻松访问点的x和y分量。例如 plot(x=points[:,1], y=points[:,2]) 但是,有时最好将点视为点列表/点集,而不是矩阵。例如,我需要检查某个点(例如[01])是否是点的元素。直截了当的版本不起作用: [0 1] in points # is false 相反,我必须手动将点扩展到点列表: [0 1] in [points[i,:] for

我在2D空间中有一组点,表示为秩2数组:

points = [0 0; 0 1; 1 0]
它是一种有用的表示法,因为它允许轻松访问点的x和y分量。例如

plot(x=points[:,1], y=points[:,2])
但是,有时最好将
视为点列表/点集,而不是矩阵。例如,我需要检查某个点(例如
[01]
)是否是
点的元素。直截了当的版本不起作用:

[0 1] in points  # is false
相反,我必须手动将
扩展到点列表:

[0 1] in [points[i,:] for i in 1:size(points)[1]]  # is true

定义这样一组点、访问组件和检查成员资格的正确朱利安方法是什么


更新:按照@Jubobs的建议,我继续定义了自己的类型。事实证明,我实际上需要一个向量,所以我继续称它为
Vec2
,而不是
Point

immutable Vec2{T<:Real}
    x :: T
    y :: T
end
Vec2{T<:Real}(x::T, y::T) = Vec2{T}(x, y)
Vec2(x::Real, y::Real) = Vec2(promote(x,y)...)

convert{T<:Real}(::Type{Vec2{T}}, p::Vec2) =
    Vec2(convert(T,p.x), convert(T,p.y))
convert{Tp<:Real, T<:Real, S<:Real}(::Type{Vec2{Tp}}, t::(T,S)) =
    Vec2(convert(Tp, t[1]), convert(Tp, t[2]))

promote_rule{T<:Real, S<:Real}(::Type{Vec2{T}}, ::Type{Vec2{S}}) =
    Vec2{promote_type(T,S)}

+(l::Vec2, r::Vec2) = Vec2(l.x+r.x, l.y+r.y)
-(l::Vec2, r::Vec2) = Vec2(l.x-r.x, l.y-r.y)
*(a::Real, p::Vec2) = Vec2(a*p.x, a*p.y)
*(p::Vec2, a::Real) = Vec2(a*p.x, a*p.y)
/(p::Vec2, a::Real) = Vec2(a/p.x, a/p.y)
dot(a::Vec2, b::Vec2) = a.x*b.x + a.y*b.y
zero{T<:Real}(p::Vec2{T}) = Vec2{T}(zero(T),zero(T))
zero{T<:Real}(::Type{Vec2{T}}) = Vec2{T}(zero(T),zero(T))
不可变向量2{T
我在2D空间中有一组点,表示为秩2数组[…]

这需要一组对(包含两个元素的元组)


谢谢你的回答。元组似乎是一个很好的模型,但我不能对它们进行算术运算。例如,我如何添加两个点p1+p2?我可以定义所有相应的函数
+
-
,等等,但这看起来像是一个很多关于数组的样板文件。@Lemming,这真的取决于你。是的,您可能需要定义自己的操作(无论如何,这很容易),但元组集是一种数据结构,它提供了许多数组无法提供的功能,更不用说健壮性了。事实上,如果我是您,我会一直定义我的。
julia> myset = Set( [(0,0), (0,1), (1,0)] ) # define a set of tuples
Set{(Int64,Int64)}({(0,0),(1,0),(0,1)})

julia> in((0,0),myset)             # testing for membership is easy
true

julia> x = map (p -> p[1], myset)  # access to x values is easy with 'map'
3-element Array{Any,1}:
 0
 1
 0

julia> y = map (p -> p[2], myset)  # same thing with y values
3-element Array{Any,1}:
 0
 0
 1

julia> push!(myset,(3,2))          # adding an element to the set
Set{(Int64,Int64)}({(0,0),(1,0),(3,2),(0,1)})

julia> pop!(myset,(3,2))           # removing an element from the set
(3,2)

julia> myset
Set{(Int64,Int64)}({(0,0),(1,0),(0,1)})