を実行していないので、それをデバッグすることはできません:
次のうち、#1はあなたが要求したものに最も近いですが、私はそれを信じています#3は、あなたの言及された目標、スピード、およびIDLのさまざまなバージョンとの互換性のための使い勝手の最高のブレンドを提供します。 /enter
キーワードでscope_varfetch
を使用して
1):
pro foo, G
for k = 1, 216 do begin
varname = 'atom' + strtrim(k, 1)
(scope_varfetch(varname, level=-1, /enter)) = G[*, 0:*:(215 + k)]
endfor
end
これは、対話的に実行された場合、呼び出し元のルーチンで、または$MAIN$
にatom216
を通じてatom1
という名前の変数を作成します。私はこれがあなたが要求したものに最も近いと思います。また、構文のようprint, atom5
などのいずれかを使用して名前で呼び出し元の関数から直接、これらの変数にアクセスすることができます。
for k = 1, 216 do begin
varname = 'atom' + strtrim(k, 1)
print, scope_varfetch(varname)
endfor
2)IDL 8.0+ Listオブジェクトの使用:リストであることを
atom = list(length=216)
for k = 0, 215 do atom[k] = G[*, 0:*:(216 + k)]
注意を0-索引付けされています。つまり、最初の要素は1ではなくゼロです。最初のアトムにアクセスするにはatom[0]
を使用します。最初のアトムの最初のインデックスにアクセスするには、カッコで囲み、追加の角括弧セットを使用してインデックス番号:(atom[0])[0, 0]
を使用します。 IDLの珍しいorder of operationsのためにかっこが必要です。
3)ポインタ配列の使用:これはそれを行うための最も効率的で互換性の高い方法です
atom = ptrarr(216, /allocate_heap)
for k = 0, 215 do *atom[k] = ptr_new(G[*, 0:*:(216 + k)])
:
atom = ptrarr(216)
for k = 0, 215 do atom[k] = ptr_new(G[*, 0:*:(216 + k)])
またはわずかに異なる構文を持つが。ポインタとそれに関連するptrarr
とptr_new
関数はIDL 5.0以来存在しており、リスト、ハッシュ、またはscope_varfetch
よりはるかに効率的です。 リストと同様に、これは0でインデックス付けされていることに注意してください。また、これらの値にアクセスするには、最初のアトム配列を印刷する場合はprint, *atom[0]
、最後のアレーの最初の要素を印刷する場合はprint, (*atom[0])[0, 0]
など、*
を「尊重」する必要があります。括弧はリストと同じ理由で必要です。値は(*atom[0])[1, 15] = new_values
のような構文でも設定できます。 IDL 8.0以上ハッシュを使用
4)は:
atoms = hash()
for k = 1, 216 do begin
name = 'atom' + strtrim(k, 1)
atoms[name] = G[*, 0:*:(215 + k)]
endfor
これらはatoms['atom0']
ように参照することができます。配列がより効率的であるため、これはおそらくこの場合の最適な選択肢ではないと思いますが、使用する必要がある追加の文字列名がある場合や、データインデックスがまばらな場合は非常に便利です。
5)create_struct
と構造を構築するには:
atoms = !null
for k = 1, 216 do begin
tagname = 'atom' + strtrim(k, 1)
atoms = create_struct(atoms, tagname, G[*, 0:*:(215 + k)])
endfor
これは非常に遅いが、それが行われています一度理解することは比較的容易です。 atoms.atom1
のような各配列を取得し、atoms.atom1[0, 0]
のような要素を取得します。