2

例えば、

私のファイルは00.dat、01.dat、02.dat ... にちなんで命名されています。各ファイルには複数の列が含まれており、READCOLそれらを変数に読み込むために使用します。

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a0, b0
    readcol, string(i, F='(I02)')+'.dat', F='D,D', a1, b1
    .
    .
    c1 = a1 / a0
    c2 = a2 / a0
    .
    .
    d1 = b1 / b0
    d2 = b2 / b0
    .
    .
endfor

これは問題なく動作しますが、たとえば 100 個の変数がある場合、すべての変数を 1 つずつ入力することはできません。

したがって、 for ループを使用してa(i), b(i), c(i), d(i)を生成します。その意味で、コードは次のようになります。

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat',F='D,D', a(i), b(i)
endfor

for i = 0, n-1 do begin
    c(i) = a(i) / a(0)
    d(i) = b(i) / b(0)
endfor

しかし、これは機能しません。for ループ内および数学の実行中に変数を宣言する方法はありますか?

(私は英語のネイティブ スピーカーではありません。質問で不明な点があればお知らせください。ありがとうございます!)

4

1 に答える 1

5

StackOverflow で別の IDL プログラマーに会えてうれしいです!

問題の一部は、READCOL出力に単純な変数名が期待されていることだと思います.2番目の例では、 and の代わりに and のような配列式を指定し a(i)b(i)aますb

私があなたの質問を正しく理解していれば、最初の例の 1 次元配列 、 、 などを 2 次元配列a0a1などに置き換えたいと考えてい ます。各配列には次元 (nfiles、samples_per_file) があります。したがって、各ファイルから読み取られる行数が事前にわかっている場合は、次のようにすることができます。b0b1ab

a=dblarr(n,samples_per_file)
b=dblarr(n,samples_per_file)
; similarly for c, d, etc.

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat',F='D,D', x, y
    a[i,*] = x
    b[i,*] = y
    c[i,*] = x/x[0]
    d[i,*] = y/y[0]
endfor

このバージョンはREADCOL、予想される単純な変数名を渡し、それらを 2 次元変数の部分配列にコピーします。

各ファイルに含まれるサンプル数が事前にわからない場合は、最初のループ反復中に 2 次元配列を割り当てることができます。

for i = 0, n-1 do begin
    readcol, string(i, F='(I02)')+'.dat',F='D,D', x, y
    if (i EQ 0) then begin
       samples_per_file = n_elements(x)
       a = dblarr(n, samples_per_file)
       b = dblarr(n, samples_per_file)
       c = dblarr(n, samples_per_file)
       d = dblarr(n, samples_per_file)
    endif
    a[i,*] = x
    b[i,*] = y
    c[i,*] = x/x[0]
    d[i,*] = y/y[0]
endfor

もちろん、これはすべて、各ファイルに同じ数のサンプルが含まれていることを前提としています。そうでない場合は、abc、およびdをポインターの 1 次元配列に変更してから、 を使用PTR_NEWして各ファイルのデータを読み取るときにメモリを割り当てる必要があります。

(配列のインデックス付けに角かっこ表記を使用したことに注意してください。これは、関数呼び出しと混同される可能性がある などより[]も少し読みやすいと思います。)a(i)b(i)

于 2010-01-24T22:03:52.453 に答える