понедельник, 5 сентября 2016 г.

О тензорном произведении матриц в MathCAD

В Маткаде есть масса операций с матрицами, но при попытке найти операцию тензорного произведения матриц выяснилось что штатные средства такого не поддерживают. Далее выяснилось, что, тем не менее, это в Маткаде "немножко есть". И далее выяснилось, что это "немножко" "немножко недоделано". Далее по порядку.

Как-то понадобилось посмотреть чему равны некоторые операции от тензорного произведения матриц в MathCAD. Была некоторая идея, и надо было просто проверить. Но в штатных списках функций и на тулбаре матричных операций такой не нашлось. Поиск в интернете ничего толком не дал.

Решение, как оказалось, существует. В подкаталоге userEFI в каталоге куда установлен сам MathCAD располагаются плагины внешних определяемых пользователем функций. Это dll, имеющие определенный маткадом интерфейс взаимодействия. И там же находятся примеры программирования таких плагинов. В каталоге

/userEFI/microsft/sources/treasury/kroneckr

находится как раз пример тензорного произведения двух матриц. В подкаталоге userEFI находится результат компиляции, файл Kroneckr.dll. Если его нет, то надо скомпилировать или обратиться к программистам чтобы скомпилировали. Собственно, сама функция тензорного произведения матриц в этом плагине называется "kronecker" и имеет комментарий-пояснение "Kronecker product of a square matrix M and a square matrix N". Использовать функцию надо ровно с тем же именем как она объявлена в dll.

Выглядит это примерно так:



В чем тут фокус - в том, что у тензорного произведения матриц есть три названия, и все относятся к одному и тому же: тензорное, прямое и кронекеровское. Вот по имени кронекеровского произведения эта операция и добавлена дополнительно в качестве примера программирования плагина.

В комментарии к функции указано, что аргументы ожидаются строго квадратными: "Kronecker product of a square matrix M and a square matrix N". При попытке передать функции неквадратные матрицы, хотя бы один аргумент, функция генерирует ошибку и настаивает чтобы оба аргумента были квадратными матрицами.

В действительности же это усечение функциональности в самом плагине, он не полностью реализует тензорное произведение. Само по себе тензорное произведение, оно же прямое, оно же кронекеровское, определено для матриц произвольной размерности. По сути, само по себе матричное произведение матриц уже есть тензорное произведение плюс свертка. Возьмем, к примеру, две матрицы, где сама операция свертки ничего не меняет - это произведение матрицы-столбца на матрицу-строку. Выглядит это примерно так:



Очевидно, что там где свертке по факту не соответствует никаких операций, матричное произведение матриц полностью эквивалентно исходному тензорному произведению матриц.

Так что, во-первых, в штатный набор функций MathCAD тензорное произведение матриц не входит, во-вторых входит, но в виде дополнительного плагина и, в-третьих, входит усеченно по функциональности, поддерживая только квадратные матрицы в качестве аргументов.

В целом, для решения моих задач этого хватило более чем, а на будущее, конечно, решение состоит в доделке плагина так, чтобы он мог работать с произвольными матрицами, как это и определено для тензорного или кронекеровского произведения.

Комментариев нет:

Отправить комментарий