私は互いに固定の関係を持つフィールドを含むJulia型を作成したいと思います。説明のために、2次元の点を表し、デカルト座標(x、y)と極座標(r、theta)座標の両方を表すフィールドを持つPoint型を考えてみましょう。これらのフィールドは、r * cos(theta)= xとr * sin(theta)= yによって関連づけられなければならず、いずれの座標セットを指定してもPointを構築することができます。問題は、このタイプのコンストラクタを作る良い方法は何ですか?両方のベストを取得するにはコメント、一つの方法:あなたがご紹介させていただきます場合Juliaに関連するフィールドを持つ型を構築する
2
A
答えて
4
「
またtype Cartesian
x::Float64; y::Float64
end
type Polar
r::Float64; t::Float64
end
type Point
x::Float64; y::Float64
r::Float64; t::Float64
end
# secondary external constructors
Point(c::Cartesian) = Point(c.x, c.y, sqrt(c.x^2+c.y^2), atan2(c.y, c.x))
Point(p::Polar) = Point(p.r * cos(p.t), p.r * sin(p.t), p.r, p.t)
Point(x::Float64, y::Float64) = Point(Cartesian(x,y)) # ... etc
、とクリスに関してsub'typesを、あなたのような何かを行うことができます」簡単な変換関数ではなく、クロージャー生成関数を作成して、初期化した後は状態を保持し、変換を無償で極座標に戻すことができるようにすることです。ここで
3
が可能な実装です:
abstract CoordSys
abstract Cartesian <: CoordSys
abstract Polar <: CoordSys
transform(r, theta, ::Type{Polar}) = r*cos(theta), r*sin(theta)
transform(x, y, ::Type{Cartesian}) = sqrt(x^2+y^2), atan2(y, x)
immutable Point{T<:AbstractFloat}
x::T
y::T
r::T
theta::T
function Point(x, y, r, theta)
x_ctrl, y_ctrl = transform(r, theta, Polar)
if isapprox(x_ctrl, x, atol = 1e-15) && isapprox(y_ctrl, y, atol = 1e-15)
new(x, y, r, theta)
else
error("Coordinates are inconsistent")
end
end
end
# These constructors take the coordinate system as an additional argument
Point{T<:AbstractFloat}(x::T, y::T, C::Type{Cartesian}) = Point{T}(x, y, transform(x,y,C)...)
Point{T<:AbstractFloat}(r::T, theta::T, C::Type{Polar}) = Point{T}(transform(r,theta,C)..., r, theta)
# Convenience methods
Point{C<:CoordSys}(x::Real, y::Real, ::Type{C}) = Point(promote(float(x), float(y))..., C)
Point(x, y) = Point(x, y, Cartesian)
それは建設後も、それらを強制するために建設し、immutable
タイプの関係を強化するために、内部コンストラクタを使用しています。
関連する問題
- 1. Julia:タプル値を持つ辞書を構築する
- 2. 動的フィールドを持つSolr Suggesterを構築する
- 3. は自分の型シグネチャを持つ関数を構築する - 私は、データ型定義されているコード
- 4. パラメトリックデータ型を構築する
- 5. C++:2つの関連するキーを持つ高速構造
- 6. Typescript関数を持つ連合型
- 7. 関連する形質型を持つ形質の実装
- 8. オブジェクトの関連階層を効率的に構築する
- 9. Reflection.Emit:GenericTypeParameterBuilder型パラメータを持つ構築型のMethodInfoを取得します。
- 10. NULL引数を持つJulia関数
- 11. symfony 1.4でJSONオブジェクトを構築し、htmlコンテンツのフィールドを持つ
- 12. Ruby on Rails Associationを構築して2つの関連する関連を割り当てよう
- 13. Rails:深い関連を構築するためのフォーム
- 14. アンドロイド、R.javaを持つためにプロジェクトを構築するには?
- 15. 連想配列を構築する
- 16. Elasticsearchの検索フィールドに関連する関連レコードを見つける方法
- 17. すべての依存関係を持つ.aarを構築する
- 18. ブロックを持つXMLを構築する - タフな1つ
- 19. imgur型ポストを構築する方法
- 20. 中小型javascriptプログラムを構築する
- 21. データ型の構築に関するチェックの実行方法
- 22. を連結二つのフィールド(匿名関数を持つ1)
- 23. libgdxの片面にテクスチャを持つボックスを構築する - パフォーマンス
- 24. 実行時に 'const'パラメータを持つクラスを構築する
- 25. Djangoクエリ最適化関連フィールドの関連フィールドをカウントする
- 26. ジェネリック型関連する型のプロトコルを実装する構造体
- 27. 関連オブジェクトのフィールドに関連するフィールドDjango
- 28. extjs 6 1つのファイルに連結して構築する
- 29. 廃止予定の依存関係を持つDockerイメージを構築する
- 30. JuliaからC構造体のフィールド値を更新する
ちょうどそれを一方向に格納し、他の形式の座標を与える関数を持つのはどうですか? –
@ChrisRackauckas一般的に(私が与えたポイントの例よりも洗練されたタイプのために)、フィールド間の関係は計算が複雑でコストがかかるかもしれません。それを一度計算してオブジェクトに永久に関連付けておく方が良いです。 – Yly
多分メモリがより大きな要件なので、それは簡単ではないので、いつものようにアプリケーションに依存します。必要な場合は、これらの関数を記述してコンストラクタで使用することができます。その問題は何ですか? –