私が知っているいくつかのオプションがあります:
以下のうち、#1 はあなたが要求したものに最も近いものですが、#3 は、言及された目標、速度、およびさまざまなバージョンの IDL との互換性に対して、使いやすさの最良のブレンドを提供すると考えています。
1)キーワードscope_varfetch
での使用:/enter
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
atom1
これによりatom216
、呼び出し元のルーチンで、または$MAIN$
対話的に実行された場合は inという名前の変数が作成されます。ご要望に一番近いと思います。次のような構文を使用して、呼び出し元の関数から名前でこれらの変数に直接アクセスすることもできます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 ではなく 0 です。atom[0]
最初のアトムへのアクセスなどに使用します。最初のアトムの最初のインデックスにアクセスするには、括弧で囲み、追加の括弧セットを使用して index: を指定します(atom[0])[0, 0]
。かっこは、IDL の通常とは異なる操作順序のために必要です。
3) ポインタ配列の使用:
atom = ptrarr(216)
for k = 0, 215 do atom[k] = ptr_new(G[*, 0:*:(216 + k)])
または、わずかに異なる構文で:
atom = ptrarr(216, /allocate_heap)
for k = 0, 215 do *atom[k] = ptr_new(G[*, 0:*:(216 + k)])
これは、最も効率的で互換性の高い方法です。ポインターと関連するptrarr
およびptr_new
関数は IDL 5.0 から存在しており、リスト、ハッシュ、またはscope_varfetch
. リストと同様に、これは 0-indexed であることに注意してください。また、これらの値にアクセスするには、最初のアトム配列を出力するか、最初の配列の最初の要素を出力するなどのように*
、 でそれらを「参照」する必要があります。リストと同じ理由で括弧が必要です。のような構文で値を設定することもできます。print, *atom[0]
print, (*atom[0])[0, 0]
(*atom[0])[1, 15] = new_values
4) IDL 8.0+ ハッシュの使用:
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]
。