Использование кода LISP в максимумах
Я хочу использовать (make-array '(4 3 8))
в максимумах, которые в основном для создания матрицы Multi-D, так как я не могу найти API для создания матриц Multi-D, в том числе с array(name,d1,d2...dm)
,
Я могу выполнить это с помощью :lisp (make-array '(4 3 8))
но я не знаю, как я могу обозначить это как что-то вроде,
arr: :lisp(make-array '(4 3 8))
Я также хочу знать, возможно ли использовать код lis p внутри функций максимума. Любая помощь будет высоко оценена.
2 ответа
Чтобы создать именованный массив в коде Лисп точно так же, как array(name, d1, d2, ..., dm)
, записывать:
(mfuncall '$array name d1 d2 ... dm)
Вы не можете включать код Lisp непосредственно в функции Maxima. Но вы можете вызывать функции Lisp. Если функция lisp названа $foo
то в максиме это foo
; если в Лиспе это foo
то в максиме это ?foo
, Например:
:lisp (defun $foo (x) ...)
f(x) := print (foo (x));
Кстати, обработка массивов у Maxima все еще беспорядок... может быть, когда-нибудь мы это исправим.
Ты можешь использовать make_array
создавать массивы напрямую:
(%i18) make_array(fixnum,4,3,8);
(%o18) {Array: #3A(((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0))
((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)))}
Или свяжите результаты вызовов Lisp следующим образом:
(%i21) :lisp (msetq $foo (make-array '(4 3 8)));
#3A(((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)))
(%i21) foo;
(%o21) {Array: #3A(((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL))
((NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)
(NIL NIL NIL NIL NIL NIL NIL NIL)))}
Кстати, array
вероятно, работал для вас тоже. Я никогда не использовал его, и сначала был смущен, так как он не печатается после создания. Но после проверки документации и статьи Wikibooks:
(%i22) array(A,2,2,2);
(%o22) A
(%i23) arrayinfo(A);
(%o23) [declared, 3, [2, 2, 2]]
(%i24) A[0,1,2]: 2;
(%o24) 2
(%i25) listarray(A);
(%o25) [#####, #####, #####, #####, #####, 2, #####, #####, #####, #####,
#####, #####, #####, #####, #####, #####, #####, #####, #####, #####, #####,
#####, #####, #####, #####, #####, #####]
Похоже, что в Maxima есть несколько вариантов для такого рода вещей, или, как цитирует Роберт Додье в приведенной выше статье Wikibooks: "Текущая семантика / матрица Maxima - беспорядок […]"