Uma matriz ortogonal é uma matriz quadrada com entradas reais cujas colunas e linhas são vetores unitários ortogonais (ou seja, vetores ortonormais).
Isso significa que M ^ TM = I, onde I é a matriz de identidade e ^ T significa transposição da matriz.
Observe que isso é ortogonal e não "ortogonal especial", portanto o determinante de M pode ser 1 ou -1.
O objetivo desse desafio não é a precisão da máquina; portanto, se M ^ TM = I estiver dentro de quatro casas decimais, tudo ficará bem.
A tarefa é escrever código que pega um número inteiro positivo n > 1
e gera uma matriz ortogonal aleatória n por n . A matriz deve ser escolhida aleatoriamente e uniformemente dentre todas as n por n matrizes ortogonais. Nesse contexto, "uniforme" é definido em termos da medida de Haar, que requer essencialmente que a distribuição não mude se multiplicada por qualquer matriz ortogonal livremente escolhida. Isso significa que os valores da matriz serão valores de ponto flutuante no intervalo de -1 a 1.
A entrada e a saída podem ser de qualquer forma que você achar conveniente.
Por favor, mostre um exemplo explícito do seu código em execução.
Você não pode usar nenhuma função de biblioteca existente que crie matrizes ortogonais. Esta regra é um pouco sutil, então vou explicar mais. Essa regra proíbe o uso de qualquer função existente que receba alguma (ou nenhuma) entrada e produza uma matriz de tamanho de pelo menos n por n que é garantidamente ortogonal. Como exemplo extremo, se você quiser a matriz de identidade n por n, precisará criar você mesma.
Você pode usar qualquer biblioteca gerador de números aleatórios padrão para escolher números aleatórios de sua escolha.
Seu código deve ser concluído dentro de alguns segundos por n < 50
.
diag
? Cria uma matriz diagonal que é de fato ortogonal, mas nem sempre ortonormal.diag
, tudo bem.Respostas:
Haskell,
169150148141132131 131 bytesEstenda recursivamente uma matriz ortogonal de tamanho
n-1
adicionando 1 ao canto inferior direito e aplique uma reflexão aleatória de Household.randn
fornece uma matriz com valores aleatórios de uma distribuição gaussiana ez d
fornece um vetor de unidade uniformemente distribuído emd
dimensões.haussholder tau v
retorna a matrizI - tau*v*vᵀ
que não é ortogonal quandov
não é um vetor de unidade.Uso:
fonte
1×1
matriz leva muito espaço para o meu gosto, um caso especial apenas para obter zero, a partir de uma variável aleatória gaussiana: / (Sem ele, há uma chance infinitesimal para obter uma coluna de zero)Python 2 + NumPy, 163 bytes
Agradecemos ao xnor por apontar para usar valores aleatórios distribuídos normais em vez de valores uniformes.
Usa a ortogonalização de Gram Schmidt em uma matriz com valores aleatórios gaussianos para ter todas as direções.
O código de demonstração é seguido por
n = 3:
n = 5:
É concluído em um piscar de olhos por n = 50 e alguns segundos em n = 500.
fonte
-0.5
n
.Mathematica, 69 bytes, provavelmente não concorrente
QRDecomposition
retorna um par de matrizes, a primeira das quais é garantida como ortogonal (e a segunda não é ortogonal, mas triangular superior). Pode-se argumentar que isso tecnicamente obedece à letra da restrição no post: não gera uma matriz ortogonal, mas um par de matrizes.Mathematica, 63 bytes, definitivamente não concorrente
Orthogonalize
é inequivocamente proibido pelo OP. Ainda assim, o Mathematica é bem legal né?fonte
You may not use any existing library function which creates orthogonal **matrices**.