2011-02-10 6 views
0

私はこのようなループを持っている:私は何をできるようにしたいと思い、各原子、たとえば、atom_kためにメモリに配列を格納し、さらに操作を実行するために、これらの異なる変数を呼び出すことですIDL FORループの出力変数にラベルを付けて、同じプログラム内のループ外でさらに処理する方法を教えてください。

FOR k = 1,216 DO atom = G[*,0:*:(215+k)] END 

FORループの外側にあります。 概念的に、私はややこのように「K」カウンターで「原子」変数にラベルを付けたい:「k」は、この場合には、もはやラベルですので、もちろん

FOR k = 1,216 DO atom(k) = G[*,0:*:(215+k)] END 

、これは動作しません。誰か知っていますか?

答えて

0

あなたは、ITTVisによって開発された言語であるIDLについて話していると思います。 GとEND命令のインデックス方法がわかりませんが、私は最新バージョンで作業していません。

EXECUTEコマンドを試してください。これにより、実行時に文を実行できます。

FOR k = 1,216 DO status = EXECUTE('atom_'+strtrim(k,2)+' = G[,0::(215+'+strtrim(k,2)+')]') END 

STRTRIMは、整数を空白なしの文字列に変換します。

0

不揃いの配列を作成しようとしているようです。あなたが望むのは、サブリストの要素数が異なるリストのリストのようなデータ構造です。これはバージョンに依存しますが、8で導入されたlist()関数がこれを正確に行うように見えます。

atoms = list() 
FOR k = 1,216 DO atoms.add, G[*,0:*:(215+k)] END 

実際には、リスト()が空のリストを作成する適切な方法であるとは肯定的ではありません。私は、私の知るいくつかのオプションがあります。8.

0

を実行していないので、それをデバッグすることはできません:

次のうち、#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)]) 

またはわずかに異なる構文を持つが。ポインタとそれに関連するptrarrptr_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]のような要素を取得します。

関連する問題