1 @c English version 2013-08-03
3 @node Arrays, Estructuras, Listas, Tipos de datos y estructuras
8 * Introducción a los arrays::
9 * Funciones y variables para los arrays::
14 @node Introducción a los arrays, Funciones y variables para los arrays, Arrays, Arrays
15 @subsection Introducción a los arrays
17 Los arrays más flexibles son aquellos que no necesitan ser declarados, llamados
18 también, en inglés, @i{hashed-arrays}, y se basan en que a una variable
19 subindicada se le puede asignar un valor cualquiera. Los índices
20 no necesitan ser números enteros, admitiéndose símbolos o
21 expresiones. Los arrays no declarados crecen dinámicamente según se le van
22 asignando valores a sus elementos. En el siguiente ejemplo se muestra cómo
23 se va construyendo un array no declarado @code{a}. Para obtener un listado de
24 los elementos de un array se utiliza la función @code{listarray}.
37 Otro tipo de arrays son los declarados, los cuales admiten hasta cinco dimensiones
38 y pueden guardar valores de un tipo concreto, como @code{fixnum} para enteros o
39 @code{flonum} para reales de coma flotante. Maxima distingue dos tipos de arrays
40 declarados; los primeros se pueden definir declarando un símbolo
41 como array, haciendo uso de la función @code{array}; los segundos son arrays
42 de Lisp, en los que un símbolo se declara como tal con la
43 función @code{make_array}.
45 En el primer ejemplo se declara el símbolo @code{a} como array,
46 mientras que en el segundo se declara @code{b} como array de Lisp.
49 (%i1) array(a, fixnum, 2, 2);
51 (%i2) b: make_array(fixnum, 2, 2);
52 (%o2) @{Array: #2A((0 0) (0 0))@}
55 Cuando a la variable opcional @code{use_fast_arrays} se le asigna el valor
56 @code{true}, la función @code{array} también generará un array de Lisp.
57 Tal es lo que sucede en el ejemplo siguiente, en el que el símbolo
58 @code{c} queda declarado como array de Lisp. Téngase en cuenta que por este
59 método no se puede asignar el tipo de array, ya que al introducirle el tipo
60 @code{fixnum} se genera un mensaje de error.
63 (%i3) use_fast_arrays: true;
66 (%o4) #2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))
68 (%o5) #2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))
69 (%i6) array(c, fixnum, 2, 2);
71 make_array: dimensions must be integers; found [fixnum + 1, 3, 3]
72 -- an error. To debug this try: debugmode(true);
75 Maxima también dispone de funciones array, que pueden almacenar
76 valores de funciones, y de funciones subindicadas.
78 Se puede encontrar más información en las descripciones de las
79 funciones. Los siguientes símbolos y funciones de Maxima
80 permiten trabajar con arrays:
83 array arrayapply arrayinfo
84 arraymake arrays fillarray
85 listarray make_array rearray
86 remarray subvar subvarp
98 @node Funciones y variables para los arrays, , Introducción a los arrays, Arrays
99 @subsection Funciones y variables para los arrays
101 @deffn {Función} array (@var{nombre}, @var{dim_1}, ..., @var{dim_n})
102 @deffnx {Función} array (@var{nombre}, @var{type}, @var{dim_1}, ..., @var{dim_n})
103 @deffnx {Función} array ([@var{nombre_1}, ..., @var{nombre_m}], @var{dim_1}, ..., @var{dim_n})
105 Crea un array de dimensión @math{n}, que debe ser menor o igual que 5. Los subíndices de la @math{i}-ésima dimensión son enteros que toman valores entre 0 y @var{dim_i}.
107 La llamada @code{array (@var{nombre}, @var{dim_1}, ..., @var{dim_n})} crea un array de tipo general.
109 La llamada @code{array (@var{nombre}, @var{type}, @var{dim_1}, ..., @var{dim_n})} crea un array con sus elementos del tipo especificado. El tipo @var{type} puede ser @code{fixnum} para enteros de tamaño limitado o @code{flonum} para números decimales en coma flotante.
111 La llamada @code{array ([@var{nombre_1}, ..., @var{nombre_m}], @var{dim_1}, ..., @var{dim_n})}
112 crea @math{m} arrays, todos ellos de igual dimensión.
113 @c SAME TYPE AS WELL ??
115 @c THIS DISCUSSION OF UNDECLARED ARRAYS REALLY WANTS TO BE SOMEWHERE ELSE
116 Si el usuario asigna un valor a una variable subindicada antes de declarar el array correspondiente, entonces se construye un array no declarado. Los arrays no declarados, también conocidos por el nombre de "arrays de claves" (hashed arrays), son más generales que los arrays declarados. El usuario no necesita declarar su tamaño máximo y pueden ir creciendo de forma dinámica. Los subíndices de los arrays no declarados no necesitan ser necesariamente números. Sin embargo, a menos que un array tenga sus elementos dispersos, probablemente sea más eficiente declararlo siempre que sea posible antes que dejarlo como no declarado. La función @code{array} puede utilizarse para transformar un array no declarado a a uno declarado.
117 @c HOW DOES ONE CHANGE AN UNDECLARED ARRAY INTO A DECLARED ARRAY EXACTLY ??
121 @deffn {Función} arrayapply (@var{A}, [@var{i_1}, ..., @var{i_n}])
122 Evalúa @code{@var{A} [@var{i_1}, ..., @var{i_n}]}, donde @var{A} es un array y @var{i_1}, ..., @var{i_n} son enteros.
124 Esto es como @code{apply}, excepto por el hecho de que el primer argumento es un array en lugar de una función.
128 @deffn {Función} arrayinfo (@var{A})
129 Devuelve información sobre el array@var{A}.
130 El argumento @var{A} puede ser un array declarado o no declarado,
131 una función array o una función subindicada.
133 En el caso de arrays declarados, @code{arrayinfo} devuelve una
134 lista que contiene el átomo @code{declared}, el número de
135 dimensiones y el tamaño de cada dimensión.
136 Los elementos del array, tanto los que tienen valores
137 asignados como los que no, son devueltos por @code{listarray}.
139 En el caso de arrays no declarados (@i{hashed arrays}), @code{arrayinfo}
140 devuelve una lista que contiene el átomo @code{hashed}, el número
141 de subíndices y los subíndices de aquellos
142 elementos que guarden un valor. Los valores son devueltos por @code{listarray}.
144 En el caso de funciones array, @code{arrayinfo} devuelve una lista que
145 contiene el átomo @code{hashed}, el número de subíndices
146 y los subíndices para los que la función tiene valores almacenados.
147 Los valores almacenados de la función array son devueltos por @code{listarray}.
149 En el caso de funciones subindicadas, @code{arrayinfo} devuelve una lista que
150 contiene el átomo @code{hashed}, el número de subíndices y
151 los subíndices para los que hay expresiones lambda.
152 Las expresiones lambda son devueltas por @code{listarray}.
156 @code{arrayinfo} y @code{listarray} aplicadas a una array declarado.
166 (%i1) array (aa, 2, 3);
168 (%i2) aa [2, 3] : %pi;
170 (%i3) aa [1, 2] : %e;
172 (%i4) arrayinfo (aa);
173 (%o4) [declared, 2, [2, 3]]
174 (%i5) listarray (aa);
175 (%o5) [#####, #####, #####, #####, #####, #####, %e, #####,
176 #####, #####, #####, %pi]
179 @code{arrayinfo} y @code{listarray} aplicadas a una array no declarado (@i{hashed arrays}).
182 @c bb [FOO] : (a + b)^2;
183 @c bb [BAR] : (c - d)^3;
188 (%i1) bb [FOO] : (a + b)^2;
191 (%i2) bb [BAR] : (c - d)^3;
194 (%i3) arrayinfo (bb);
195 (%o3) [hashed, 1, [BAR], [FOO]]
196 (%i4) listarray (bb);
198 (%o4) [(c - d) , (b + a) ]
201 @code{arrayinfo} y @code{listarray} aplicadas a una función array.
204 @c cc [x, y] := y / x;
211 (%i1) cc [x, y] := y / x;
223 (%i4) arrayinfo (cc);
224 (%o4) [hashed, 2, [4, z], [u, v]]
225 (%i5) listarray (cc);
231 @code{arrayinfo} y @code{listarray} aplicadas a una función subindicada.
234 @c dd [x] (y) := y ^ x;
241 (%i1) dd [x] (y) := y ^ x;
247 (%o2) lambda([y], y )
250 (%o3) lambda([y], y )
251 (%i4) arrayinfo (dd);
252 (%o4) [hashed, 1, [b + a], [v - u]]
253 (%i5) listarray (dd);
255 (%o5) [lambda([y], y ), lambda([y], y )]
260 @deffn {Función} arraymake (@var{name}, [@var{i_1}, ..., @var{i_n}])
262 El resultado es una referencia a array no evaluada.
264 Devuelve la expresión @code{@var{name} [@var{i_1}, ..., @var{i_n}]}.
266 Esta función es similar a @code{funmake}, excepto que el valor retornado es referencia a un array no evaluado, en lugar de una llamada a una función no evaluada.
270 @c arraymake (A, [1]);
271 @c arraymake (A, [k]);
272 @c arraymake (A, [i, j, 3]);
273 @c array (A, fixnum, 10);
274 @c fillarray (A, makelist (i^2, i, 1, 11));
275 @c arraymake (A, [5]);
277 @c L : [a, b, c, d, e];
278 @c arraymake ('L, [n]);
280 @c A2 : make_array (fixnum, 10);
281 @c fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
282 @c arraymake ('A2, [8]);
287 (%i1) arraymake (A, [1]);
290 (%i2) arraymake (A, [k]);
293 (%i3) arraymake (A, [i, j, 3]);
296 (%i4) array (A, fixnum, 10);
298 (%i5) fillarray (A, makelist (i^2, i, 1, 11));
300 (%i6) arraymake (A, [5]);
305 (%i8) L : [a, b, c, d, e];
306 (%o8) [a, b, c, d, e]
307 (%i9) arraymake ('L, [n]);
312 (%i11) A2 : make_array (fixnum, 10);
313 (%o11) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
314 (%i12) fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
315 (%o12) @{Array: #(1 2 3 4 5 6 7 8 9 10)@}
316 (%i13) arraymake ('A2, [8]);
325 @defvr {Variable del sistema} arrays
326 Valor por defecto: @code{[]}
327 La variable @code{arrays} es una lista con todos los arrays que han sido alojados,
328 lo que comprende a los arrays declarados por @code{array}, a los
329 no declarados (@i{hashed arrays}) construidos implícitamente
330 (asignando algo al elemento de un array) y a las funciones array definidas
331 mediante @code{:=} y @code{define}.
332 Los arrays definidos mediante @code{make_array} no se incluyen en
336 @code{array}, @code{arrayapply}, @code{arrayinfo}, @code{arraymake},
337 @code{fillarray}, @code{listarray} y @code{rearray}.
343 @c bb [FOO] : (a + b)^2;
345 @c dd : make_array ('any, 7);
349 (%i1) array (aa, 5, 7);
351 (%i2) bb [FOO] : (a + b)^2;
354 (%i3) cc [x] := x/100;
358 (%i4) dd : make_array ('any, 7);
359 (%o4) @{Array: #(NIL NIL NIL NIL NIL NIL NIL)@}
367 @deffn {Función} arraysetapply (@var{A}, [@var{i_1}, @dots{}, @var{i_n}], @var{x})
369 Asigna @var{x} a @code{@var{A}[@var{i_1}, ..., @var{i_n}]},
370 siendo @var{A} un array y @var{i_1}, @dots{}, @var{i_n} enteros.
372 @code{arraysetapply} evalúa sus argumentos.
377 @deffn {Función} fillarray (@var{A}, @var{B})
378 Rellena el array @var{A} con los valores de @var{B}, que puede ser una lista o array.
380 Si se ha declarado @var{A} de un determinado tipo en el momento de su
381 creación, sólo podrá contener elementos de ese tipo, produciéndose
382 un error en caso de intentar asignarle un elemento de tipo distinto.
384 Si las dimensiones de los arrays @var{A} y @var{B} son diferentes,
385 @var{A} se rellena según el orden de las filas. Si no hay
386 suficientes elementos en @var{B} el último elemento se utiliza
387 para cubrir el resto de @var{A}. Si hay demasiados, los elementos
388 sobrantes son ignorados.
390 La función @code{fillarray} devuelve su primer argumento.
394 Creación de un array de 9 elementos y posterior relleno a partir de una lista.
396 @c array (a1, fixnum, 8);
398 @c fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
403 (%i1) array (a1, fixnum, 8);
405 (%i2) listarray (a1);
406 (%o2) [0, 0, 0, 0, 0, 0, 0, 0, 0]
407 (%i3) fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
409 (%i4) listarray (a1);
410 (%o4) [1, 2, 3, 4, 5, 6, 7, 8, 9]
413 Si no hay suficientes elementos para cubrir el array, se repite el
414 último elemento. Si hay demasiados, los elementos
415 sobrantes son ignorados.
417 @c a2 : make_array (fixnum, 8);
418 @c fillarray (a2, [1, 2, 3, 4, 5]);
419 @c fillarray (a2, [4]);
420 @c fillarray (a2, makelist (i, i, 1, 100));
424 (%i1) a2 : make_array (fixnum, 8);
425 (%o1) @{Array: #(0 0 0 0 0 0 0 0)@}
426 (%i2) fillarray (a2, [1, 2, 3, 4, 5]);
427 (%o2) @{Array: #(1 2 3 4 5 5 5 5)@}
428 (%i3) fillarray (a2, [4]);
429 (%o3) @{Array: #(4 4 4 4 4 4 4 4)@}
430 (%i4) fillarray (a2, makelist (i, i, 1, 100));
431 (%o4) @{Array: #(1 2 3 4 5 6 7 8)@}
434 Arrays multidimensionales se rellenan según el orden de las filas.
436 @c a3 : make_array (fixnum, 2, 5);
437 @c fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
438 @c a4 : make_array (fixnum, 5, 2);
439 @c fillarray (a4, a3);
443 (%i1) a3 : make_array (fixnum, 2, 5);
444 (%o1) @{Array: #2A((0 0 0 0 0) (0 0 0 0 0))@}
445 (%i2) fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
446 (%o2) @{Array: #2A((1 2 3 4 5) (6 7 8 9 10))@}
447 (%i3) a4 : make_array (fixnum, 5, 2);
448 (%o3) @{Array: #2A((0 0) (0 0) (0 0) (0 0) (0 0))@}
449 (%i4) fillarray (a4, a3);
450 (%o4) @{Array: #2A((1 2) (3 4) (5 6) (7 8) (9 10))@}
456 @deffn {Función} listarray (@var{A})
457 Devuelve una lista con los elementos del array @var{A}.
458 El argumento @var{A} puede ser un array declarado o no declarado,
459 una función array o una función subindicada.
461 Los elementos se ordenan en primera instancia respecto del primer
462 índice, después respecto del segundo índice
464 La ordenación de los índices es la misma que la
465 establecida por @code{orderless}.
467 En el caso de arrays no declarados, funciones array y funciones
468 subindicadas, los elementos corresponden a los índices
469 devueltos por @code{arrayinfo}.
471 Los elementos de los arrays declarados que no tienen valores asignados
472 (excepto @code{fixnum} y @code{flonum}) se devuelven como @code{#####}.
473 Los elementos sin valores asignados de los arrays @code{fixnum} y @code{flonum}
474 son devueltos como 0 y 0.0, respectivamente.
475 Los elementos sin valor asignado de los arrays no declarados,
476 funciones array y funciones subindicadas no son devueltos.
480 @code{listarray} y @code{arrayinfo} aplicadas a un array declarado.
490 (%i1) array (aa, 2, 3);
492 (%i2) aa [2, 3] : %pi;
494 (%i3) aa [1, 2] : %e;
496 (%i4) listarray (aa);
497 (%o4) [#####, #####, #####, #####, #####, #####, %e, #####,
498 #####, #####, #####, %pi]
499 (%i5) arrayinfo (aa);
500 (%o5) [declared, 2, [2, 3]]
503 @code{listarray} y @code{arrayinfo} aplicadas a un array no declarado (@i{hashed array}).
506 @c bb [FOO] : (a + b)^2;
507 @c bb [BAR] : (c - d)^3;
512 (%i1) bb [FOO] : (a + b)^2;
515 (%i2) bb [BAR] : (c - d)^3;
518 (%i3) listarray (bb);
520 (%o3) [(c - d) , (b + a) ]
521 (%i4) arrayinfo (bb);
522 (%o4) [hashed, 1, [BAR], [FOO]]
525 @code{listarray} y @code{arrayinfo} aplicadas a una función array.
528 @c cc [x, y] := y / x;
535 (%i1) cc [x, y] := y / x;
547 (%i4) listarray (cc);
551 (%i5) arrayinfo (cc);
552 (%o5) [hashed, 2, [4, z], [u, v]]
555 @code{listarray} y @code{arrayinfo} aplicadas a una función subindicada.
558 @c dd [x] (y) := y ^ x;
565 (%i1) dd [x] (y) := y ^ x;
571 (%o2) lambda([y], y )
574 (%o3) lambda([y], y )
575 (%i4) listarray (dd);
577 (%o4) [lambda([y], y ), lambda([y], y )]
578 (%i5) arrayinfo (dd);
579 (%o5) [hashed, 1, [b + a], [v - u]]
584 @deffn {Función} make_array (@var{tipo}, @var{dim_1}, ..., @var{dim_n})
586 Construye y devuelve un array de Lisp. El argumento @var{tipo} puede ser
587 @code{any}, @code{flonum}, @code{fixnum}, @code{hashed} o @code{functional}.
588 Hay @math{n} índices, y el índice @math{i}-ésimo
589 va de 0 a @math{@var{dim_i} - 1}.
591 La ventaja de @code{make_array} sobre @code{array} estriba en que el valor
592 retornado no tiene nombre, y una vez que un puntero deja de referenciarlo,
593 el valor desaparece. Por ejemplo, si @code{y: make_array (...)} entonces
594 @code{y} apunta a un objeto que ocupa cierto espacio en la memoria, pero
595 después de @code{y: false}, @code{y} ya no apunta al objeto, por lo
596 que éste puede ser considerado basura y posteriormente eliminado.
600 @c A1 : make_array (fixnum, 10);
603 @c A2 : make_array (flonum, 10);
604 @c A2 [2] : 2.718281828;
606 @c A3 : make_array (any, 10);
607 @c A3 [4] : x - y - z;
609 @c A4 : make_array (fixnum, 2, 3, 5);
610 @c fillarray (A4, makelist (i, i, 1, 2*3*5));
615 (%i1) A1 : make_array (fixnum, 10);
616 (%o1) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
620 (%o3) @{Array: #(0 0 0 0 0 0 0 0 1729 0)@}
621 (%i4) A2 : make_array (flonum, 10);
622 (%o4) @{Array: #(0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
623 (%i5) A2 [2] : 2.718281828;
627 @{Array: #(0.0 0.0 2.718281828 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
628 (%i7) A3 : make_array (any, 10);
629 (%o7) @{Array: #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)@}
630 (%i8) A3 [4] : x - y - z;
633 (%o9) @{Array: #(NIL NIL NIL NIL ((MPLUS SIMP) $X ((MTIMES SIMP)\
634 -1 $Y) ((MTIMES SIMP) -1 $Z))
635 NIL NIL NIL NIL NIL)@}
636 (%i10) A4 : make_array (fixnum, 2, 3, 5);
637 (%o10) @{Array: #3A(((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0)) ((0 0 \
638 0 0 0) (0 0 0 0 0) (0 0 0 0 0)))@}
639 (%i11) fillarray (A4, makelist (i, i, 1, 2*3*5));
640 (%o11) @{Array: #3A(((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15))
641 ((16 17 18 19 20) (21 22 23 24 25) (26 27 28 29 30)))@}
648 @c DOES THIS MODIFY A OR DOES IT CREATE A NEW ARRAY ??
649 @deffn {Función} rearray (@var{A}, @var{dim_1}, ..., @var{dim_n})
650 Cambia las dimensiones de un array. El nuevo array será rellenado con los elementos del viejo según el orden de las filas. Si el array antiguo era demasiado pequeño, los elementos restantes se rellenan con @code{false}, @code{0.0} o @code{0}, dependiendo del tipo del array. El tipo del array no se puede cambiar.
654 @deffn {Función} remarray (@var{A_1}, ..., @var{A_n})
655 @deffnx {Función} remarray (all)
656 Borra los arrays y las funciones relacionadas con ellos, liberando el espacio de memoria ocupado.
657 Los argumentos pueden ser arrays declarados, arrays no declarados (@i{hashed arrays}),
658 funciones array y funciones subindicadas.
660 La llamada @code{remarray (all)} borra todos los elementos de la lista global @code{arrays}.
662 La función @code{remarray} devuelve la lista de los arrays borrados.
664 La función @code{remarray} no evalúa sus argumentos.
669 @deffn {Función} subvar (@var{x}, @var{i})
670 Evalúa la expresión subindicada @code{@var{x}[@var{i}]}.
672 La función @code{subvar} evalúa sus argumentos.
674 La instrucción @code{arraymake (@var{x}, [@var{i}])} construye la expresión @code{@var{x}[@var{i}]},
683 @c foo : [aa, bb, cc, dd, ee]$
685 @c arraymake (x, [i]);
696 (%i4) foo : [aa, bb, cc, dd, ee]$
700 (%i6) arraymake (x, [i]);
711 @deffn {Función} subvarp (@var{expr})
712 Devuelve @code{true} si @var{expr} es una variable subindicada, como @code{a[i]}.
718 @c THIS IS REALLY CONFUSING
719 @defvr {Variable opcional} use_fast_arrays
720 Valor por defecto: @code{false}
722 Si @code{use_fast_arrays} vale @code{true} entonces tan solo se reconocen dos tipos de arrays.
724 @c AQUI QUEDAN TRES PARRAFOS SIN TRADUCIR