Ортогональная матрица представляет собой квадратную матрицу с вещественными элементами , чьи столбцы и строки являются ортогональные орты (т.е. ортонормальные векторы).
Это означает, что M ^ TM = I, где I - единичная матрица, а ^ T означает транспонирование матрицы.
Обратите внимание, что это ортогональный, а не «специальный ортогональный», поэтому определитель М может быть 1 или -1.
Целью этой задачи является не точность машины, поэтому, если M ^ TM = I с точностью до 4 десятичных знаков, это будет хорошо.
Задача состоит в том, чтобы написать код, который принимает положительное целое число n > 1
и выводит случайную ортогональную матрицу n на n . Матрица должна выбираться случайным образом и равномерно из всех n по n ортогональных матриц. В этом контексте «униформа» определяется в терминах меры Хаара, которая, по сути, требует, чтобы распределение не изменялось при умножении на произвольно выбранную ортогональную матрицу. Это означает, что значения матрицы будут значениями с плавающей запятой в диапазоне от -1 до 1.
Вход и выход могут быть любой формы, которая вам удобна.
Пожалуйста, покажите явный пример выполнения вашего кода.
Вы не можете использовать любую существующую библиотечную функцию, которая создает ортогональные матрицы. Это правило немного тонкое, поэтому я объясню больше. Это правило запрещает использование любой существующей функции, которая принимает некоторые (или не принимает) входные данные и выводит матрицу размером не менее n на n, которая гарантированно будет ортогональной. В качестве крайнего примера, если вы хотите, чтобы n - n единичная матрица, вам придется создать ее самостоятельно.
Вы можете использовать любую стандартную библиотеку генератора случайных чисел для выбора случайных чисел по вашему выбору.
Ваш код должен завершиться в течение максимум нескольких секунд n < 50
.
diag
? Это создает диагональную матрицу, которая действительно ортогональна, но не всегда ортонормирована.diag
должно быть в порядке.Ответы:
Haskell,
169150148141132131 байтРекурсивно расширяйте ортогональную матрицу размера
n-1
, добавляя 1 в нижний правый угол и применяя случайное отражение Домохозяина.randn
дает матрицу со случайными значениями из гауссовского распределения иz d
дает равномерно распределенный единичный вектор поd
измерениям.haussholder tau v
возвращает матрицу,I - tau*v*vᵀ
которая не ортогональна, когдаv
не является единичным вектором.Применение:
источник
1×1
матрицы занимает слишком много места на мой вкус, особый случай только для получения нуля из гауссовой случайной величины: / (Без этого есть бесконечно малый шанс получить нулевой столбец)Python 2 + NumPy, 163 байта
Спасибо xnor за указание использовать обычные распределенные случайные значения вместо равномерных.
Использует ортогонализацию Грама Шмидта на матрице с гауссовыми случайными значениями, чтобы иметь все направления.
Код демонстрации сопровождается
п = 3:
п = 5:
Это завершается за мгновение для n = 50 и несколько секунд для n = 500.
источник
-0.5
n
.Mathematica, 69 байт, вероятно, не конкурирует
QRDecomposition
возвращает пару матриц, первая из которых гарантированно будет ортогональной (а вторая из которых не ортогональна, а верхняя треугольная). Можно утверждать, что это технически подчиняется букве ограничения в посте: он не выводит ортогональную матрицу, но пару матриц ....Mathematica, 63 байта, определенно неконкурентный
Orthogonalize
однозначно запрещено ОП. Тем не менее, Mathematica довольно круто, а?источник
You may not use any existing library function which creates orthogonal **matrices**.