2016-10-24 9 views
2

私は単純な剛体シミュレーションを書くことによってJuliaを学んできましたが、私は変数の割り当てと変更についてまだまだ混乱しています。配列の配列の最初の要素を指すようにベクトルの要素を設定するにはどうすればよいですか?

私は体の形状を構成する点を配列の配列に格納しています。ここでは、1つのベクトルが点のx、y、z座標を保持します。 PyPlotでボディをプロットするために、ポイントはまずローカル座標からワールド座標に変換され、ポイントのx、y、z座標をそれぞれ保持する3つの配列に割り当てられます。私は3つの配列は、値のコピーを持つ代わりに配列の値の配列を参照するようにしたいと思います。

私のコードの関連部分は、彼らが真と評価===持つ要素をbody_to_world()を呼び出すと確認した後、この

type Rigidbody 
    n::Integer 
    k::Integer 
    bodyXYZ::Array{Array{Float64,1},2} 
    worldXYZ::Array{Array{Float64,1},2} 
    worldX::Array{Float64,2} 
    worldY::Array{Float64,2} 
    worldZ::Array{Float64,2} 
    Rotmat::Array{Float64,2} 
    x::Array{Float64,1} 
end 
# body.worldXYZ[1,1] = [x; y; z] 
# and body.worldX[1,1] should be body.worldXYZ[1,1][1] 

function body_to_world(body::Rigidbody) 
    for j in range(1, body.k) 
     for i in range(1, body.n) 
      body.worldXYZ[i,j] = body.x + body.Rotmat*body.bodyXYZ[i,j] 
      body.worldX[i,j] = body.worldXYZ[i,j][1] 
      body.worldY[i,j] = body.worldXYZ[i,j][2] 
      body.worldZ[i,j] = body.worldXYZ[i,j][3] 
     end 
    end 
    return nothing 
end 

のように見えますが、私はその後、例えば

body.worldXYZ[1,1][1] = 99.999 
を設定した場合

変更はbody.worldXに反映されません。問題はおそらく些細なことですが、私のコードからわかるように、私は初心者であり、助けを借りることができます。

答えて

3
body.worldX[i,j] = body.worldXYZ[i,j][1] 

ここで番号を設定しています。数字は変更可能ではないため、body.worldX[i,j]body.worldXYZ[i,j][1]を参照しません。あなたが考えているのは、配列の値は参照になりますが、数値には参照がなく、値自体はありません。


しかし、あなたがそういうことをしていると、間違った問題が起こっていると言います。あなたはたぶんどこかの型を使うべきです。覚えておいてください、Juliaのタイプは良いパフォーマンスを与えるので、それらを恐れてはいけません(そして、不変型はカーネベルのPR後にほぼ完全に最適化されるはずですので、恐れる必要はありません)。代わりに、私はworld::Array{Point,2}どこ

immutable Point{T} 
    x::T 
    y::T 
    z::T 
end 

次にあなたがxためbody.world[i,j].xは、などを調整得ることができます。そして自由のためのあなたはx年代への参照の配列を取得するためにmap((i,j)->Ref(body.world[i,j].x),size(body.world)...)を使用することができますになるだろう。

または、タイプにディスパッチを追加する必要があります。例えば

import Base: size 
size(RigidBody) = (n,k) 

size(body)出力(n,k)、それは配列だかのように。 getindexsetindex!でアレイインターフェイスを完成させることができます。このような種類のディスパッチを追加すると、コードを大幅に整理できます。

+0

ありがとうございました!ポイントのタイプを使用することは、私が考えてきたことですが、これまでには得られていません。あなたは不変の選択について精緻化することができますか? – Boxed

+0

さて、私はRefの配列を作成しようとしましたが、まだ更新されません。 – Boxed

+0

変更不可能とは、値を変更できないことを意味します。したがって、Pointの 'x'を変更する代わりに、新しい' Point'を作成する必要があります。しかし、この選択により、コンパイラは基本的にコンパイラが "オーバーヘッド"を最小限に抑えることができますが(小さなビットがありますが、v0.6の変更はそれを修正しています)、immutablesを使用するとすべてが構文的な砂糖になり、パフォーマンスを犠牲にする。変更可能な型は変更可能です(配列は可変型です)ので、最適化することはできません。 –

関連する問題