2017-07-17 8 views
2

複合タイプをメンバーxyで作成したいと思います。しかし、私はそれが非Point2Dの通常の数学関数に参加したいと思います。たとえば、Point2D(1,2) + [1,1]は、の値が[2,3]になるようにします。作成方法マトリクス演算で使用できるポイントタイプ

私はWhen is Julia's convert() used?に基づいconvertpromote_rule機能を作成したが、その後、私のタイプはconvert EDである何かのサブタイプである必要が実現しました。しかし、VectorまたはVector{T}またはArrayまたはAbstractArrayのいずれかのタイプのサブタイプを試みて、自分のタイプを変換に参加させようとすると、私はERROR: invalid subtyping in definition of Point2Dとなります。実験として私のタイプにNumberのサブタイプをtype Point2D{T} <: Numberのようにすると、少なくともファイルはエラーなしでロードされますが、試してみるとPoint2D(1,2) + [1,1]ERROR: no promotion exists for GridCalc.Point2D{Int64} and Int64となります。

私はPoint2Dを代わりにmutable structにしようとしましたが、<: Vector{T}も「取らない」でしょう。ここで

はコードです:

type Point2D{T} # Fails when I add <: Vector{T}, etc. 
    x::T 
    y::T 
end 

# Convert a Point2D to a vector of the same type 
convert{T1, T2<:Vector{T1}}(::Type{T2}, p::Point2D{T1}) = [p.x, p.y] 

# Choose Vector when given the option 
promote_rule{T1<:Real, T2<:Point2D{T1}, T3<:Vector{T1}}(::Type{T2}, ::Type{T3}) = T3 

質問:

  1. これは、それが2ベクトルであるかのようPoint2Dは、数学関数に参加できるように正しいアプローチですか?

  2. は、どのように私は自分のPoint2Dはこれを行う方法は、AbstractVector{T}をサブタイプにあるVector{T}

答えて

2

のサブタイプであることを得るのです。ジュリアでは、抽象型のみをサブタイプ化できます。 Vector{T}は具体的なタイプです。また、いくつかの必要なメソッドを実装する必要があります。詳細についてはinterfaces chapterを参照してください:あなたはまた、そのポイントの定義とその周辺のメソッドに対してJuliaGeometry organizationGeometryTypes.jlを見てみましょう(および/または使用)することができます

julia> type Point2D{T} <: AbstractVector{T} 
      x::T 
      y::T 
     end 
     Base.getindex(p::Point2D, i::Int) = getfield(p, i) 
     Base.size(::Point2D) = (2,) 

julia> Point2D(1,2) 
2-element Point2D{Int64}: 
1 
2 

julia> [1 2; 3 4; 5 6] * Point2D(1,2) 
3-element Array{Int64,1}: 
    5 
11 
17 

+0

完璧!私は私が近くにいることを知っていた。ありがとう:) – Sonicsmooth

関連する問題