IDL向量问题,附加值超过~30000

时间:2013-11-30 18:05:31

标签: arrays idl-programming-language

不幸的是,我找不到这个问题的答案,不得不提出问题。如果在其他地方有答案,我道歉,我是IDL的新手,并且不知道如何完美地说出这一点。

我的代码如下:

for i=0,delta-1 do begin
    print, flrarray[i]
    numbr_for_arr=where(del gt ((flrarray[i])-0.000001) and del lt ((flrarray[i])+0.000001))
    print,numbr_for_arr
    postnflrarray[i]=numbr_for_arr
endfor

delta只是一个数字。 finalflrarray只是一个数组,具有del(一个巨大的数组)

所需的特定点

我的输出如下:

   ...
   24.000231 ; flrarray
   23392 ; numbr_for_arr
   24.748374
   26612
   24.213783
   27473
   24.368324
   30637
   24.711283
   32432
   24.426823
   37675
   24.039426
   40733

打印flrarray和postnflrarray

   ...       24.000231       24.748374       24.213783       24.368324       24.711283       24.426823       24.039426
   ...       23392           26612           27473           30637           32432           -27861          -24803

正如你所看到的,在某种程度上打印numbr_for_array并附加它

37675 - > -27861 和 40733 - > -24803

对于为什么会发生这种情况的任何见解将不胜感激。

我必须强调flrarray数组/向量来自外部源,因此我使用此方法来查找它在'del'数组中的位置。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

postnflrarray需要成为'lonarr'

即postnflrarray = lonarr(N) 其中N是数组的长度。这归结为数组中的值为16位有符号整数(最大大小约为32767)。当你附加一个大于它的值时,它会溢出变为负数。

答案 1 :(得分:0)

根据您提供的内容,您似乎在标量上使用WHERE。您希望将WHERE与数组参数一起使用。然后结果将给出与给定条件匹配的指数。例如,要查找大于0.99的正弦曲线的元素,请执行:

IDL> x = findgen(360) * !dtor
IDL> y = sin(x)
IDL> ind = where(y gt 0.99, count)
IDL> print, count
          17
IDL> print, ind
          82          83          84          85          86          87          88          89
          90          91          92          93          94          95          96          97
          98
IDL> print, y[ind]
     0.990268     0.992546     0.994522     0.996195     0.997564     0.998630     0.999391
     0.999848      1.00000     0.999848     0.999391     0.998630     0.997564     0.996195
     0.994522     0.992546     0.990268

答案 2 :(得分:0)

我使用评论对代码进行了略微修改:

;;  If FLRARRAY is a one-dimensional array, then you could define the
;;    following outside of the for loop
;;  updn = [[flrarray - 1e-6],[flrarray + 1e-6]]
;for i=0,delta-1 do begin
for i=0L,delta-1L do begin
  print, flrarray[i]
;  numbr_for_arr=where(del gt ((flrarray[i])-0.000001) and del lt ((flrarray[i])+0.000001))
  ;;  Note:  WHERE.PRO should be returning long integers, not integers.  However, your
  ;;         output seems to suggest otherwise which is odd.
  numbr_for_arr = where(del gt (flrarray[i] - 0.000001) and del lt (flrarray[i] + 0.000001),nmb)*1L
;;  numbr_for_arr = where(del gt updn[i,0] and del lt updn[i,1],nmb)
  print,numbr_for_arr
;  postnflrarray[i]=numbr_for_arr  ;;  what if there is more than one element?
  if (nmb GT 0) then postnflrarray[i] = numbr_for_arr[0]
endfor