5

私はこれを間違った方法で行っているかもしれませんが、ループ内で配列を定義して埋めようとしています。

for i = 0,39 do begin

xx = long(findgen(n+1l)*sx + line1x[i]) 
sz = size(xx)
arrayname = 'line' + strtrim(i,2)
arrayname = findgen(3,sz[1])
arrayname[0,*] = xx
arrayname[1,*] = yy
arrayname[2,*] = vertline

endfor

これは明らかに機能しませんが、「line」+ strtrim(i、2)で定義された文字列を使用して、反復ごとに新しい配列を作成して入力する方法はありますか?この場合、line0...39という名前の40個の配列があります。ここで難しいのは、sz [1]が変化することです。そのため、すべてを保持する1つの大きな配列を単純に定義することはできません。

4

2 に答える 2

3

idl 8.0 以降ではHASH、これにデータ型を使用できます。

コードは次のようになります。

array_dict = hash()
for ii = 0,39 do begin
  xx = long(findgen(n+1l)*sx + line1x[ii]) 
  sz = size(xx)
  arrayname = 'line' + string(1, FORMAT='(i02)')
  array = findgen(3,sz[1])
  array[0,*] = xx
  array[1,*] = yy
  array[2,*] = vertline

  array_dict[arrayname] = array
endfor

名前で配列にアクセスできるようになりました。

line = array_dict['line01']
于 2011-02-22T00:49:47.123 に答える
2

まあ、execute汚いハックをしたい気分なら (ライセンスのない仮想マシンのインストールで実行する必要がない場合)、常にこの機能があります。

しかし、各要素が 3 x sz サブ配列の 1 つを指している、ポインターの 1 次元配列を宣言することを考えたことはありますか? これにより、すべてのサブ配列が同じ形状でなければならないという制約なしに、1 つの大きな配列の利点がいくらか得られます。こんな感じかも…。

ptrs=ptrarray(40) ; Allocate an array of 40 pointers, initialized to null

for i = 0,39 do begin
  ; calculate sz, xx, yy, vertline
  dummy=findgen(3,sz[1])
  dummy[0,*] = xx
  dummy[1,*] = yy
  dummy[2,*] = vertline
  ptrs[i]=ptr_new(dummy) ; create copy of dummy on the heap, storing pointer in ptrs[i]

endfor

; To access the i-th subarray...

(*ptrs[i])[0,*] = new_xx
(*ptrs[i])[1,*] = new_yy
(*ptrs[i])[2,*] = new_vertline
于 2010-08-06T06:52:44.650 に答える