Документация Engee

Символьные массивы

Symbolics поддерживает выражения символьных массивов (символьные массивы). Выражения символьных массивов распространяют полезные метаданные, которые зависят от входных массивов: измерение массива, тип и форма элемента.

Вы можете создать переменную символьного массива с помощью следующего синтаксиса.

using Symbolics
@variables A[1:5, 1:3] b[1:3]
2-element Vector{Symbolics.Arr{Num}}:
 A[1:5,1:3]
 b[1:3]

Здесь A является символьной матрицей размером (5, 3), а b — символьным вектором длиной 3.

size(A)
(5, 3)
size(b)
(3,)
ndims(A)
2
ndims(b)
1
eltype(A)
Real
eltype(b)
Real

Операции с массивами

Операции с символьными массивами возвращают выражения символьных массивов:

c = A * b
(A*b)[Base.OneTo(5)]
size(c)
(5,)
eltype(c)
Real

Поддерживаются сопряжения, умножения матрицы на матрицу и матрицы на вектор. Скалярное произведение возвращает скалярное выражение:

b'b
(adjoint(b)*b)[1]
size(b'b)
()

Внешнее произведение возвращает матрицу:

b * b'
(b*adjoint(b))[Base.OneTo(3),Base.OneTo(3)]
size(b*b')
(3, 3)

Трансляция, сопоставление и сокращение

A .* b'
(broadcast(*, A, adjoint(b)))[Base.OneTo(5),Base.OneTo(3)]
map(asin, (A*b))
(map(asin, A*b))[Base.OneTo(5)]
#sum(A) #latexify не работает
typeof(sum(A))
Num
typeof(sum(A, dims=2))
Symbolics.Arr{Num, 2}

Индексирование и вычисление с запаздыванием

Индексирование выражений массивов в Symbolics выполняется довольно гибко. Давайте рассмотрим все возможные способы индексирования массивов.

Скалярное индексирование и скаляризация

AAt = A*A'
(A*adjoint(A))[Base.OneTo(5),Base.OneTo(5)]
AAt[2,3]
(A*adjoint(A))[2, 3]

Здесь мы выполняли индексирование для элемента (2,3), но получили в ответ символьное выражение индексирования. Вам может потребоваться вычислить элемент с точки зрения элементов A. Это можно сделать с помощью функции scalarize.

Symbolics.scalarize(AAt[2,3])
A[2, 1]*A[3, 1] + A[2, 2]*A[3, 2] + A[2, 3]*A[3, 3]
@syms i::Int j::Int
Symbolics.scalarize(AAt[i,j])
A[i, 1]*A[j, 1] + A[i, 2]*A[j, 2] + A[i, 3]*A[j, 3]

В общем случае любое скалярное выражение, полученное из выражений массива, может быть скаляризовано.

#sum(A[:,1]) + sum(A[2,:])#latexify не работает
Symbolics.scalarize(sum(A[:,1]) + sum(A[2,:]))
A[1, 1] + 2A[2, 1] + A[2, 2] + A[2, 3] + A[3, 1] + A[4, 1] + A[5, 1]