4 @c OriginalRevision=1.16
5 @c TranslatedBy: (c) 2005-12 Vadim V. Zhytnikov <vvzhyt@gmail.ru>
8 * Функции и переменные для работы с массивами::
11 @node Функции и переменные для работы с массивами, , Массивы, Массивы
12 @section Функции и переменные для работы с массивами
14 @deffn {Функция} array (@var{name}, @var{dim_1}, ..., @var{dim_n})
15 @deffnx {Функция} array (@var{name}, @var{type}, @var{dim_1}, ..., @var{dim_n})
16 @deffnx {Функция} array ([@var{name_1}, ..., @var{name_m}], @var{dim_1}, ..., @var{dim_n})
18 Создает @math{n}-мерный массив.
19 Значение @math{n} должно быть меньше или равно 5.
20 @math{i}-й индекс может принимать целочисленное значение от
23 @code{array (@var{name}, @var{dim_1}, ..., @var{dim_n})} -- создает
26 @code{array (@var{name}, @var{type}, @var{dim_1}, ..., @var{dim_n})}
27 -- создает массив, элементы которого имеют определенный тип.
28 @var{type} может быть @code{fixnum} для целых чисел ограниченной
29 точности и @code{flonum} для чисел с плавающей точкой.
31 @code{array ([@var{name_1}, ..., @var{name_m}], @var{dim_1}, ..., @var{dim_n})}
32 -- создает @math{m} массивов одинаковой размерности.
33 @c SAME TYPE AS WELL ??
35 @c THIS DISCUSSION OF UNDECLARED ARRAYS REALLY WANTS TO BE SOMEWHERE ELSE
36 Если пользователь присваивает значение переменной с индексом
37 до того, как соответствующий массив объявлен, тогда создается
38 необъявленный массив. Необъявленные массивы, также известные как
39 хеш-массивы (т.к. для хранения элементов применяется
40 хеширование), являются более общими чем объявленные массивы.
41 Пользователь не определяет их максимальный размер, и они
42 растут динамически по мере присваивания значений их элементам.
43 Индексы необъявленных массивов даже не обязаны быть целочисленными.
44 Однако, за исключением случая когда массив сильно разряжен,
45 объявленный массив, обычно, более эффективен чем необъявленный.
46 Функция @code{array} может преобразовать необъявленный массив
48 @c HOW DOES ONE CHANGE AN UNDECLARED ARRAY INTO A DECLARED ARRAY EXACTLY ??
50 @opencatbox{Категории:}
56 @deffn {Функция} arrayapply (@var{A}, [@var{i_1}, ..., @var{i_n}])
57 Вычисляет значение @code{@var{A} [@var{i_1}, ..., @var{i_n}]},
58 где @var{A} -- массив, а @var{i_1}, ..., @var{i_n} целые числа.
60 Данная функция похожа на @code{apply}, только первый аргумент является
61 массивом а не функцией.
63 @opencatbox{Категории:}
70 @deffn {Функция} arrayinfo (@var{A})
71 Возвращает информацию о массиве @var{A}.
72 Аргумент @var{A} может быть объявленным массивом, необъявленным (хеш-) массивом,
73 функцией-массивом или функцией с индексом.
75 Для объявленного массива @code{arrayinfo} возвращает список состоящий из
76 атома @code{declared}, размерности массива и размера каждого из измерений.
77 Элементы массива, как имеющие значение, так и не имеющие значения,
78 возвращаются функцией @code{listarray}.
80 Для необъявленных массивов (хеш-массивов) @code{arrayinfo}
81 возвращает список состоящий из атома @code{hashed}, числа индексов и
82 индексов всех элементов, которые имеют значение.
83 Значения массива возвращаются функцией @code{listarray}.
86 @code{arrayinfo} возвращает список состоящий из атома @code{hashed}, числа индексов и
87 индексов всех элементов, которые содержат функциональные значения.
88 Функциональные значения возвращаются функцией @code{listarray}.
90 Для функций с индексом
91 @code{arrayinfo} возвращает список состоящий из атома @code{hashed}, числа индексов и
92 индексов всех элементов, которые содержат лямбда-выражения.
93 Лямбда-выражения возвращаются функцией @code{listarray}.
97 @code{arrayinfo} и @code{listarray} примененные к объявленному массиву.
107 (%i1) array (aa, 2, 3);
109 (%i2) aa [2, 3] : %pi;
111 (%i3) aa [1, 2] : %e;
113 (%i4) arrayinfo (aa);
114 (%o4) [declared, 2, [2, 3]]
115 (%i5) listarray (aa);
116 (%o5) [#####, #####, #####, #####, #####, #####, %e, #####,
117 #####, #####, #####, %pi]
120 @code{arrayinfo} и @code{listarray} примененные к необъявленному (хеш) массиву.
123 @c bb [FOO] : (a + b)^2;
124 @c bb [BAR] : (c - d)^3;
129 (%i1) bb [FOO] : (a + b)^2;
132 (%i2) bb [BAR] : (c - d)^3;
135 (%i3) arrayinfo (bb);
136 (%o3) [hashed, 1, [BAR], [FOO]]
137 (%i4) listarray (bb);
139 (%o4) [(c - d) , (b + a) ]
142 @code{arrayinfo} и @code{listarray} примененные к функции-массиву.
145 @c cc [x, y] := y / x;
152 (%i1) cc [x, y] := y / x;
164 (%i4) arrayinfo (cc);
165 (%o4) [hashed, 2, [4, z], [u, v]]
166 (%i5) listarray (cc);
172 @code{arrayinfo} и @code{listarray} примененные к функции с индексом.
175 @c dd [x] (y) := y ^ x;
182 (%i1) dd [x] (y) := y ^ x;
188 (%o2) lambda([y], y )
191 (%o3) lambda([y], y )
192 (%i4) arrayinfo (dd);
193 (%o4) [hashed, 1, [b + a], [v - u]]
194 (%i5) listarray (dd);
196 (%o5) [lambda([y], y ), lambda([y], y )]
199 @opencatbox{Категории:}
205 @deffn {Функция} arraymake (@var{A}, [@var{i_1}, ..., @var{i_n}])
206 Возвращает выражение @code{@var{A}[@var{i_1}, ..., @var{i_n}]}.
207 Этот результат является не вычисленной ссылкой на элемент
210 Функция @code{arraymake} похожа на @code{funmake},
211 за исключеним того, что возвращает не вычисленный элемент массива
212 вместо от не вычисленного вызова функции.
216 @c arraymake (A, [1]);
217 @c arraymake (A, [k]);
218 @c arraymake (A, [i, j, 3]);
219 @c array (A, fixnum, 10);
220 @c fillarray (A, makelist (i^2, i, 1, 11));
221 @c arraymake (A, [5]);
223 @c L : [a, b, c, d, e];
224 @c arraymake ('L, [n]);
226 @c A2 : make_array (fixnum, 10);
227 @c fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
228 @c arraymake ('A2, [8]);
233 (%i1) arraymake (A, [1]);
236 (%i2) arraymake (A, [k]);
239 (%i3) arraymake (A, [i, j, 3]);
242 (%i4) array (A, fixnum, 10);
244 (%i5) fillarray (A, makelist (i^2, i, 1, 11));
246 (%i6) arraymake (A, [5]);
251 (%i8) L : [a, b, c, d, e];
252 (%o8) [a, b, c, d, e]
253 (%i9) arraymake ('L, [n]);
258 (%i11) A2 : make_array (fixnum, 10);
259 (%o11) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
260 (%i12) fillarray (A2, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
261 (%o12) @{Array: #(1 2 3 4 5 6 7 8 9 10)@}
262 (%i13) arraymake ('A2, [8]);
269 @opencatbox{Категории:}
276 @defvr {Системная переменная} arrays
277 Значение по умолчанию: @code{[]}
279 Список @code{arrays} содержит всех существующих массивов.
280 Что составляет: массивы, объявленные при помощи @code{array};
281 хеш-массивы, созданные при помощи неявных определение (присваиванием чего-либо элементу массива);
282 функции-массивы, определенные с помощью @code{:=} и @code{define}.
283 Массивы, созданные при помощи @code{make_array}, в список не включаются.
286 @code{array}, @code{arrayapply}, @code{arrayinfo}, @code{arraymake},
287 @code{fillarray}, @code{listarray}, and @code{rearray}.
288 @c IS THIS AN EXHAUSTIVE LIST ??
294 @c bb [FOO] : (a + b)^2;
296 @c dd : make_array ('any, 7);
300 (%i1) array (aa, 5, 7);
302 (%i2) bb [FOO] : (a + b)^2;
305 (%i3) cc [x] := x/100;
309 (%i4) dd : make_array ('any, 7);
310 (%o4) @{Array: #(NIL NIL NIL NIL NIL NIL NIL)@}
315 @opencatbox{Категории:}
317 @category{Глобальные переменные}
322 @deffn {Функция} bashindices (@var{expr})
323 Преобразует выражение @var{expr} присваивая каждому суммированию или
324 произведению уникальный индекс. Индекс имеет форму
325 @code{j@var{number}}. Величина @var{number} определяется
326 значением переменной @code{gensumnum}, которое может быть установлено
327 пользователем. Например @code{gensumnum:0$}, инициализирует
330 @opencatbox{Категории:}
331 @category{Суммы и произведения}
336 @deffn {Функция} fillarray (@var{A}, @var{B})
337 Заполняет массив @var{A} элементами из @var{B}, являющимся
338 списком или массивом.
340 Если для массива @var{A} в момент создания был задан тип элементов,
341 то он может быть заполнен только элементами данного типа и
342 попытка заполнения элементами другого типа является ошибкой.
344 Если размерность массивов не совпадает, тогда @var{A}
345 заполняется построчно. Если число элементов @var{B} недостаточно, то
346 последний элемент используется для заполнения остатка @var{A}.
347 Если число элементов @var{B} слишком велико, тогда излишние отбрасываются.
349 @code{fillarray} возвращает свой первый аргумент.
353 Создается массив из 9 элементов и заполняется из списка.
355 @c array (a1, fixnum, 8);
357 @c fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
362 (%i1) array (a1, fixnum, 8);
364 (%i2) listarray (a1);
365 (%o2) [0, 0, 0, 0, 0, 0, 0, 0, 0]
366 (%i3) fillarray (a1, [1, 2, 3, 4, 5, 6, 7, 8, 9]);
368 (%i4) listarray (a1);
369 (%o4) [1, 2, 3, 4, 5, 6, 7, 8, 9]
372 Если недостаточно элементов для заполнения массива,
373 то последний элемент повторяется.
374 Если элементов слишком много, то излишние элементы
377 @c a2 : make_array (fixnum, 8);
378 @c fillarray (a2, [1, 2, 3, 4, 5]);
379 @c fillarray (a2, [4]);
380 @c fillarray (a2, makelist (i, i, 1, 100));
384 (%i1) a2 : make_array (fixnum, 8);
385 (%o1) @{Array: #(0 0 0 0 0 0 0 0)@}
386 (%i2) fillarray (a2, [1, 2, 3, 4, 5]);
387 (%o2) @{Array: #(1 2 3 4 5 5 5 5)@}
388 (%i3) fillarray (a2, [4]);
389 (%o3) @{Array: #(4 4 4 4 4 4 4 4)@}
390 (%i4) fillarray (a2, makelist (i, i, 1, 100));
391 (%o4) @{Array: #(1 2 3 4 5 6 7 8)@}
394 Многомерные массивы заполняются построчно.
396 @c a3 : make_array (fixnum, 2, 5);
397 @c fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
398 @c a4 : make_array (fixnum, 5, 2);
399 @c fillarray (a4, a3);
403 (%i1) a3 : make_array (fixnum, 2, 5);
404 (%o1) @{Array: #2A((0 0 0 0 0) (0 0 0 0 0))@}
405 (%i2) fillarray (a3, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
406 (%o2) @{Array: #2A((1 2 3 4 5) (6 7 8 9 10))@}
407 (%i3) a4 : make_array (fixnum, 5, 2);
408 (%o3) @{Array: #2A((0 0) (0 0) (0 0) (0 0) (0 0))@}
409 (%i4) fillarray (a4, a3);
410 (%o4) @{Array: #2A((1 2) (3 4) (5 6) (7 8) (9 10))@}
413 @opencatbox{Категории:}
419 @deffn {Функция} listarray (@var{A})
420 Возвращает список элементов массива @var{A}.
421 Аргумент @var{A} должен быть объявленным массивом, необъявленным (хеш) массивом,
422 функцией-массивом или функцией с индексами.
424 Элементы помещаются в список построчно.
425 Т.е. сначала помещаются элементы по первому индексу, затем по второму и т.д.
426 Порядок значений индексов тот же, что установлен при помощи @code{orderless}.
428 Для необъявленных массивов, функций-массивов и функций с индексом,
429 возвращаются элементы соответствующие индексам возвращаемым
430 функцией @code{arrayinfo}.
432 Для объявленных массивов общего типа (т.е не @code{fixnum} или @code{flonum}) элементы не имеющие значения
433 возвращаются как @code{#####}.
434 Не присвоенные элементы объявленных @code{fixnum} или @code{flonum} массивов
435 возвращаются как 0 или 0.0 соответственно.
436 Не присвоенные элементы необъявленных массивов, функций-массивов
437 и функций с индексом не возвращаются.
441 @code{listarray} и @code{arrayinfo} примененные к объявленному массиву.
451 (%i1) array (aa, 2, 3);
453 (%i2) aa [2, 3] : %pi;
455 (%i3) aa [1, 2] : %e;
457 (%i4) listarray (aa);
458 (%o4) [#####, #####, #####, #####, #####, #####, %e, #####,
459 #####, #####, #####, %pi]
460 (%i5) arrayinfo (aa);
461 (%o5) [declared, 2, [2, 3]]
464 @code{arrayinfo} и @code{listarray} примененные к необъявленному (хеш) массиву.
467 @c bb [FOO] : (a + b)^2;
468 @c bb [BAR] : (c - d)^3;
473 (%i1) bb [FOO] : (a + b)^2;
476 (%i2) bb [BAR] : (c - d)^3;
479 (%i3) listarray (bb);
481 (%o3) [(c - d) , (b + a) ]
482 (%i4) arrayinfo (bb);
483 (%o4) [hashed, 1, [BAR], [FOO]]
486 @code{arrayinfo} и @code{listarray} примененные к функции-массиву.
489 @c cc [x, y] := y / x;
496 (%i1) cc [x, y] := y / x;
508 (%i4) listarray (cc);
512 (%i5) arrayinfo (cc);
513 (%o5) [hashed, 2, [4, z], [u, v]]
516 @code{arrayinfo} и @code{listarray} примененные к функции с индексом.
519 @c dd [x] (y) := y ^ x;
526 (%i1) dd [x] (y) := y ^ x;
532 (%o2) lambda([y], y )
535 (%o3) lambda([y], y )
536 (%i4) listarray (dd);
538 (%o4) [lambda([y], y ), lambda([y], y )]
539 (%i5) arrayinfo (dd);
540 (%o5) [hashed, 1, [b + a], [v - u]]
543 @opencatbox{Категории:}
549 @c NEEDS CLARIFICATION
550 @deffn {Функция} make_array (@var{type}, @var{dim_1}, ..., @var{dim_n})
551 Создает и возвращает Lisp-массив. @var{type} может быть
552 @code{any}, @code{flonum}, @code{fixnum}, @code{hashed} или
555 Массив имеет @math{n} индексов, @math{i}-й индекс может принимать
556 значение от 0 до @math{@var{dim_i}-1}.
558 Преимущество @code{make_array} по сравнению с @code{array} состоит в
559 том, что возвращаемый Lisp-массив не имеет имени. И как только ссылка
560 на него исчезает, занимаемое им место освобождается.
561 Например, если @code{y: make_array (...)}, тогда @code{y} ссылается
562 на объект (массив), занимающий место в памяти.
563 Но после присваивания @code{y: false}, @code{y} больше не ссылается
564 на данный массив и занимаемое им место будет освобождено
567 @c 'FUNCTIONAL ARGUMENT IN MAKE_ARRAY APPEARS TO BE BROKEN
568 @c EVEN AFTER READING THE CODE (SRC/AR.LISP) I CAN'T TELL HOW THIS IS SUPPOSED TO WORK
569 @c COMMENTING OUT THIS STUFF TO PREVENT CONFUSION AND HEARTBREAK
570 @c RESTORE IT WHEN MAKE_ARRAY ('FUNCTIONAL, ...) IS FIXED
571 @c @code{y: make_array ('functional, 'f, 'hashed, 1)} - the second argument to
572 @c @code{make_array} in this case is the function to call to calculate array
573 @c elements, and the rest of the arguments are passed recursively to
574 @c @code{make_array} to generate the "memory" for the array function object.
578 @c A1 : make_array (fixnum, 10);
581 @c A2 : make_array (flonum, 10);
582 @c A2 [2] : 2.718281828;
584 @c A3 : make_array (any, 10);
585 @c A3 [4] : x - y - z;
587 @c A4 : make_array (fixnum, 2, 3, 5);
588 @c fillarray (A4, makelist (i, i, 1, 2*3*5));
593 (%i1) A1 : make_array (fixnum, 10);
594 (%o1) @{Array: #(0 0 0 0 0 0 0 0 0 0)@}
598 (%o3) @{Array: #(0 0 0 0 0 0 0 0 1729 0)@}
599 (%i4) A2 : make_array (flonum, 10);
600 (%o4) @{Array: #(0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
601 (%i5) A2 [2] : 2.718281828;
605 @{Array: #(0.0 0.0 2.718281828 0.0 0.0 0.0 0.0 0.0 0.0 0.0)@}
606 (%i7) A3 : make_array (any, 10);
607 (%o7) @{Array: #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)@}
608 (%i8) A3 [4] : x - y - z;
611 (%o9) @{Array: #(NIL NIL NIL NIL ((MPLUS SIMP) $X ((MTIMES SIMP)\
612 -1 $Y) ((MTIMES SIMP) -1 $Z))
613 NIL NIL NIL NIL NIL)@}
614 (%i10) A4 : make_array (fixnum, 2, 3, 5);
615 (%o10) @{Array: #3A(((0 0 0 0 0) (0 0 0 0 0) (0 0 0 0 0)) ((0 0 \
616 0 0 0) (0 0 0 0 0) (0 0 0 0 0)))@}
617 (%i11) fillarray (A4, makelist (i, i, 1, 2*3*5));
618 (%o11) @{Array: #3A(((1 2 3 4 5) (6 7 8 9 10) (11 12 13 14 15))
619 ((16 17 18 19 20) (21 22 23 24 25) (26 27 28 29 30)))@}
624 @opencatbox{Категории:}
630 @c DOES THIS MODIFY A OR DOES IT CREATE A NEW ARRAY ??
631 @deffn {Функция} rearray (@var{A}, @var{dim_1}, ..., @var{dim_n})
632 Изменяет размерность массива. Новый массив будет заполнен элементами
633 старого построчно. Если исходный массив слишком мал, тогда
634 остаток заполняется @code{false}, @code{0.0} или @code{0},
635 в зависимости от типа массива. Тип массива не может быть изменен.
637 @opencatbox{Категории:}
643 @deffn {Функция} remarray (@var{A_1}, ..., @var{A_n})
644 @deffnx {Функция} remarray (all)
645 Удаляет массив, все ассоциированные с ним функции и
646 освобождает занимаемую им память.
647 Аргументы должны быть: объявленными массивами, необъявленными (хеш)
648 массивами, функциями-массивами или функциями с индексом.
650 @code{remarray (all)} удаляет все элементы в глобальном списке @code{arrays}.
652 @c WHAT DOES THIS MEAN EXACTLY ??
653 Использование @code{remarray} может требоваться если
654 необходимо переопределить значения элементов
655 необъявленного (хеш) массива.
657 @code{remarray} возвращает список удаленных массивов.
659 @opencatbox{Категории:}
665 @deffn {Функция} subvar (@var{x}, @var{i})
666 Вычисляет выражение с индексом @code{@var{x}[@var{i}]}.
668 @code{subvar} вычисляет свои аргументы.
670 @code{arraymake (@var{x}, [@var{i}]} составляет выражение @code{@var{x}[@var{i}]},
679 @c foo : [aa, bb, cc, dd, ee]$
681 @c arraymake (x, [i]);
692 (%i4) foo : [aa, bb, cc, dd, ee]$
696 (%i6) arraymake (x, [i]);
703 @opencatbox{Категории:}
710 @c THIS IS REALLY CONFUSING
711 @defvr {Управляющая переменная} use_fast_arrays
712 -- если @code{true}, тогда используются только два типа массивов.
714 1) Art-q массивы (t в Common Lisp), которые имеют несколько
715 целочисленных индексов, и могут содержать любые Lisp или Maxima
716 объекты. Для создания таких массивов используется функция
717 @code{make_array}. Например @code{a:make_array(any,3,4);}.
718 Значение @code{a} -- массив из 12 элементов. Отсчет индексов
721 2) Hash_table массивы, создающиеся по умолчанию если выполняется
722 присваивания @code{b[x+1]:y^2} если @code{b} еще пока не является
723 массивом, списком или матрицей (во всех этих случаях должна возникнуть
724 ошибка т.к. @code{x+1} в общем случае не является допустимым индексом
725 для art-q массива, списка или матрицы). Индексом такого массива
726 (также называется ключем) может быть произвольный объект.
727 Используется только один ключ одновременно, так в @code{b[x+1,u]:y}
728 игнорирует @code{u} а соответствие устанавливается по
729 @code{b[x+1] ==> y^2}. Разумеется ключ может быть списком, например
730 @code{b[[x+1,u]]:y} вполне допустимо. Это не совместимо со старыми
731 хешируемыми массивами, но экономит память.
733 Преимущество хранения массивов в значении переменной состоит в том,
734 что в этом случае массивы следуют обычным соглашениям о локальных
735 переменных. Кроме того Hash_table массивы более эффективны и
736 используют меньше памяти, чем старые хешируемые массивы. Для
737 одинакового поведения в интерпретируемом и компилируемом коде
738 необходимо установить значение @code{translate_fast_arrays} равным
741 @opencatbox{Категории:}
743 @category{Глобальные флаги}