2010-08-04 27 views
5

Puede que esté yendo de la manera incorrecta, pero estoy intentando definir y completar matrices dentro de un bucle.definir el nombre de la matriz dentro de un bucle

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 

Esto, obviamente, no va a funcionar, pero hay una manera de utilizar la cadena definida por la 'línea' + strtrim (i, 2) para crear y llenar una nueva matriz en cada iteración? En este caso, tendría 40 matrices con nombres line0 ... 39. La parte difícil aquí es que sz [1] varía, por lo que no puedo simplemente definir una matriz grande para contener todo.

Respuesta

2

Bueno, siempre está la función execute, si está de humor para un hack sucio (y no lo necesita para ejecutar en una instalación de máquina virtual sin licencia).

¿Pero ha considerado declarar una matriz 1-D de punteros, donde cada elemento apunta a uno de los 3 por subconjuntos sz? Eso le da algunos de los beneficios de una gran matriz, sin la restricción de que todos los subarreglos tengan la misma forma. Podría ser algo como esto ...

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 
3

en IDL 8.0 o posterior se podría utilizar el tipo de datos para este HASH.

Su código se parece a esto:

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 

Ahora puede acceder a sus matrices por su nombre:

line = array_dict['line01'] 
Cuestiones relacionadas