0

次のようなFORループがあります。

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

私ができるようにしたいのは、atom_k などの各アトムの配列をメモリに格納し、これらの異なる変数を呼び出して、FOR ループの外でさらに操作を実行することです。概念的には、「atom」変数に「k」カウンターを次のようにラベル付けしたいと考えています。

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

もちろん、この場合「k」はもはやラベルではないため、これは機能しません。誰か知っていますか?

4

3 に答える 3

0

私が知っているいくつかのオプションがあります:

以下のうち、#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]

于 2013-10-18T06:52:46.523 に答える
0

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

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

list() が空のリストを作成する適切な方法であるとは確信していません。8 を実行していないため、デバッグできません。

于 2013-06-03T11:22:14.493 に答える