Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Используйте только в Интерфейсе MuPAD Notebook. Эта функциональность не запускается в MATLAB.
Обзор всех доступных функций может быть получен при помощи функции MuPAD® info
. Здесь мы видим извлечение функций, доступных в библиотеке линейной алгебры (мы не утверждаем целый вывод, сгенерированный вызовом info(linalg)
, поскольку библиотека содержит больше чем 40 различных функций):
info(linalg)
Library 'linalg': the linear algebra package -- Interface: linalg::addCol, linalg::addRow, linalg::adjoint, linalg::angle, linalg::basis, linalg::charmat, linalg::charpoly, linalg::col, ...
Будучи экспортированным, библиотечные функции могут также использоваться их коротким обозначением. Вызов функции use
(linalg)
экспортирует все функции linalg
. После того, как тот может использовать имя функции gaussElim
вместо linalg::gaussElim
, например.
Обратите внимание на то, что пользовательские процедуры, которые используют функции библиотеки linalg
, должны всегда использовать длинное обозначение linalg::functionname
в порядке убедиться, что однозначность имени функции гарантируется.
Самый легкий способ задать матричный A использует команду matrix
. Следующее задает 2×2 матрица:
A := matrix([[1, 2], [3, 2]])
Теперь, можно добавить или умножить матрицы с помощью стандартных арифметических операторов MuPAD:
A * A, 2 * A, 1/A
Далее, можно использовать функции библиотеки linalg
:
linalg::det(A)
Доменным типом, возвращенным matrix
, является Dom::Matrix
()
:
domtype(A)
который введен в следующем разделе.
Библиотека linalg
основана на областях Dom::Matrix
и Dom::SquareMatrix
. Эти конструкторы позволяют пользователю задать матрицы, и они предлагают матричную арифметику и несколько функций для матричной манипуляции.
Область, созданная Dom::Matrix
, представляет матрицы произвольных строк и столбцов по заданному звонку. Доменный конструктор Dom::Matrix
ожидает содействующий звонок категории Cat::Rng
(звонок без модуля) в качестве аргумента. Если никакой аргумент не дан, область матриц создается, который представляет матрицы по полю арифметических выражений, т.е. доменный Dom::ExpressionField
()
.
Будьте осторожны с вычислениями с матрицами по этой содействующей области, потому что их записи обычно не имеют уникального представления (например, существует больше чем одно представление нуля). Можно нормировать компоненты такого матричного A
с командой map(A, normal )
.
Библиотека Dom предлагает стандартные содействующие области, такие как поле рациональных чисел (Dom::Rational
), звонок целых чисел (Dom::Integer
), классы вычетов целых чисел (Dom::IntegerMod
(n)
) для целочисленного n
, или даже звонки полиномов (такие как Dom::DistributedPolynomial
(ind,R)
или Dom::Polynomial
(R)
, где ind
является списком переменных и R
, является содействующим звонком).
Область, созданная доменным конструктором Dom::SquareMatrix
, представляет звонок квадратных матриц по заданной содействующей области. Dom::SquareMatrix
ожидает количество строк квадратных матриц и опционально содействующего звонка категории Cat::Rng
.
Существует несколько возможностей задать матрицы области, созданной Dom::Matrix
или Dom::SquareMatrix
. Матрица может быть создана путем предоставления двумерного массива, списка матричных компонентов или функции, которая генерирует матричные компоненты:
delete a, b, c, d: A := matrix([[a, b], [c, d]])
Команда matrix
на самом деле является сокращением от доменного Dom::Matrix()
.
Чтобы создать диагональные матрицы, нужно использовать опцию Diagonal
(третий аргумент matrix
является или функцией или списком):
B := matrix(2, 2, [2, -2], Diagonal)
Следующий двум примерам показывает значение третьего аргумента:
delete x: matrix(2, 2, () -> x), matrix(2, 2, x)
MuPAD арифметические операторы используются, чтобы выполнить матричную арифметику:
A * B - 2 * B
1/A
Затем мы создаем 2×2 обобщенная Гильбертова матрица (см. также linalg::hilbert
) как матрица звонка двумерных квадратных матриц:
MatQ2 := Dom::SquareMatrix(2, Dom::Rational)
H2 := MatQ2((i, j) -> 1/(i + j - 1))
Вектор с компонентами n 1×n матрица (вектор - строка) или n ×1 матрица (вектор-столбец).
К компонентам матрицы или вектора получают доступ с помощью индексного оператора, т.е. A[i,j]
возвращает компонент строки с индексом i
и столбец с индексом j
.
Вход A[i, j]:= x
устанавливает (i, j)-th компонент матричного A
к значению x
.
Индексный оператор может также использоваться, чтобы извлечь подматрицы путем предоставления областей значений целых чисел в качестве его аргументов:
A := Dom::Matrix(Dom::Integer)( [[1, 2, 3], [4, 5, 6], [7, 8, 9]] )
A[1..3, 1..2], A[3..3, 1..3]
См. также функциональный linalg::submatrix
.
Время выполнения пользовательских процедур, которые используют функции библиотеки linalg
и методы конструкторов Dom::Matrix
и Dom::SquareMatrix
, может быть значительно улучшено в определенных случаях.
Некоторые функции библиотеки linalg
соответствуют определенным методам доменного конструктора Dom::Matrix
на их имя и функциональность. Эти функции реализованы путем вызова соответствующих методов области к этому, они принадлежат кроме дополнительной проверки аргументов. Эти функции включают удобное для пользователя использование на интерактивном уровне после экспорта.
Однако в пользовательских процедурах методы соответствующей области должны использоваться непосредственно, чтобы избежать дополнительно вызовов процедур.
Например, стандартные матричные функции манипуляции, такие как удаление, извлечение или свопинг строк и столбцов заданы как методы доменных конструкторов Dom::Matrix
и Dom::SquareMatrix
.
Метод "gaussElim"
предлагает процесс Исключения Гаусса для каждой области, созданной этими конструкторами.
При создании новой матрицы метод называется "new"
. Это преобразовывает каждый компонент матрицы явным образом на компонент звонок компонента, который может быть трудоемким.
Однако матрицы и векторы часто являются результатами вычислений, компоненты которых уже являются элементами звонка компонента. Таким образом преобразование записей не необходимо. Чтобы принять это во внимание, доменные конструкторы, Dom::Matrix
и Dom::SquareMatrix
предлагают методу "create"
, чтобы задать матрицы обычным способом, но без преобразования компонентов.
Обратите внимание на то, что этот метод не тестирует свои аргументы. Таким образом это должно использоваться с осторожностью.
Дальнейшая возможность достижения лучшего времени выполнения с помощью функций linalg
или методов конструктора, Dom::Matrix
должен сохранить функции и методы, которые называются несколько раз в локальных переменных. Это включает более быстрый доступ этих функций и методов.
Следующий пример показывает, как пользовательская процедура с помощью функций linalg
и методов доменного конструктора Dom::Matrix
может быть похожей. Это вычисляет примыкающую из квадратной матрицы, заданной по коммутативному звонку (см. Cat::CommutativeRing
):
adjoint := proc(A) local n, R, i, j, a, Ai, Mat, // local variables to store often used methods det, delRow, delCol, Rnegate; begin if args(0) <> 1 then error("wrong number of arguments") end_if; Mat := A::dom; // the domain of A R := Mat::coeffRing; // the component ring of A n := Mat::matdim(A); // the dimension of A; faster than calling // 'linalg::matdim'! if testargs() then if Mat::hasProp(Cat::Matrix) <> TRUE then error("expecting a matrix") elif not R::hasProp( Cat::CommutativeRing ) then error("expecting matrix over a 'Cat::CommutativeRing'") elif n[1] <> n[2] then error("expecting a square matrix") end_if end_if; // store often used methods in local variables: det := linalg::det; delRow := Mat::delRow; // faster than calling 'linalg::delRow'! delCol := Mat::delCol; // faster than calling 'linalg::delCol'! Rnegate := R::_negate; // faster than using the '-' operator! n := Mat::matdim(A)[1]; // faster than calling 'linalg::nrows'! a := array(1..n, 1..n); for i from 1 to n do Ai := delCol(A, i); for j from 1 to n do a[i, j] := det(delRow(Ai, j)); if i + j mod 2 = 1 then a[i, j] := Rnegate(a[i, j]) end_if end_for end_for; // create a new matrix: use Mat::create instead of Mat::new // because the entries of the array are already elements of R return(Mat::create(a)) end_proc:
Мы даем пример:
MatZ6 := Dom::Matrix(Dom::IntegerMod(6)): adjoint(MatZ6([[1, 5], [2, 4]]))