A matriz de cofator é a transposição da matriz adjuvante . Os elementos desta matriz são os cofatores da matriz original.
O cofator (isto é, o elemento da matriz de cofator na linha ie coluna j) é o determinante da submatriz formada pela exclusão da i-ésima coluna e-ésima coluna da matriz original, multiplicada por (-1) ^ (i + j).
Por exemplo, para a matriz
O elemento da matriz de cofator na linha 1 e coluna 2 é:
Você pode encontrar informações sobre qual é o determinante de uma matriz e como calculá-las aqui .
Desafio
Seu objetivo é produzir a matriz de cofator de uma matriz de entrada.
Nota : Built-ins que avaliam matrizes de cofator ou matrizes adjugadas ou determinantes ou algo semelhante são permitidos .
Entrada
A matriz pode ser inserida como um argumento de linha de comando, como um parâmetro de função, STDIN
ou de qualquer maneira que seja mais apropriada para o idioma usado.
A matriz será formatada como uma lista de listas, cada sublist correspondente a uma linha, que contém fatores ordenados da esquerda para a direita. As linhas são ordenadas de cima para baixo na lista.
Por exemplo, a matriz
a b
c d
será representado por [[a,b],[c,d]]
.
Você pode substituir os colchetes e vírgulas por outra coisa se ela se encaixar no seu idioma e for sensata (por exemplo ((a;b);(c;d))
)
Matrizes conterão apenas números inteiros (que podem ser negativos) .
As matrizes sempre serão quadradas (ou seja, o mesmo número de linhas e colunas).
Você pode assumir que a entrada estará sempre correta (ou seja, nenhum problema de formatação, nada além de números inteiros, nenhuma matriz vazia).
Resultado
A matriz de cofator resultante pode ser gerada STDOUT
, retornada de uma função, gravada em um arquivo ou qualquer coisa semelhante que naturalmente se adapte ao idioma que você usa.
A matriz do cofator deve ser formatada exatamente da mesma maneira que as matrizes de entrada são fornecidas, por exemplo [[d,-c],[-b,a]]
. Se você ler uma sequência, deverá retornar / produzir uma sequência na qual a matriz está formatada exatamente como na entrada. Se você usar algo como, por exemplo, uma lista de listas como entrada, também deverá retornar uma lista de listas.
Casos de teste
- Entrada:
[[1]]
Resultado: [[1]]
- Entrada:
[[1,2],[3,4]]
Resultado: [[4,-3],[-2,1]]
- Entrada:
[[-3,2,-5],[-1,0,-2],[3,-4,1]]
Resultado: [[-8,-5,4],[18,12,-6],[-4,-1,2]]
- Entrada:
[[3,-2,7,5,0],[1,-1,42,12,-10],[7,7,7,7,7],[1,2,3,4,5],[-3,14,-1,5,-9]]
Resultado:
[[9044,-13580,-9709,23982,-9737],[-1981,1330,3689,-3444,406],[14727,7113,2715,-9792,414],[-28448,-2674,-707,16989,14840],[-2149,2569,-2380,5649,-3689]]
Pontuação
Isso é código-golfe, então a resposta mais curta em bytes vence.
fonte
Respostas:
J, 29 bytes
O mesmo truque epsilon / inverso / determinante. Da direita para esquerda:
1e_9+
adiciona um epsilon,(-/ .**%.)
é determinante (-/ .*
) vezes inverso (%.
),|:
transpõe,<.0.5+
rodadas.fonte
Matlab,
4233 bytesUsando uma função anônima:
Entrada e saída são matrizes (matrizes numéricas 2D).
eps
é adicionado caso a matriz seja singular. É "removido" usandoround
(o resultado verdadeiro é garantido como um número inteiro).Exemplo:
Exemplo com matriz singular:
Ou experimente online no Octave.
fonte
[1,0 ; 0,0]
gera um erro quando deve ser gerado.[0,0 ; 0,1]
mat2str
: "a matriz de cofatores resultante pode ser ... retornada de uma função"mat2str
eps
é cerca de 1e-16. Portanto, torna a matriz não singular (mas muito mal condicionada). O resultado não é exatamente inteiro; entãofix
(arredondar para zero) corrige isso. Isso funciona, desde que o erro não exceda.5
. Receio que não haja garantias. Para números inteiros muito grandes, pode falhar. Eu disse que era um truque sujo :-Pmat2str
é necessário aqui? Para mim, parece que, uma vez que essa é uma função, a entrada é realmente a matriz não formatada. Por exemplo, se você tentarf=...
,f(f(...))
isso não funcionará, mas a remoçãomat2str
faz com que funcione bem.Mathematica,
2735 bytesfonte
[[1,0],[0,0]]
?R,
12194 bytesEssa é uma função absurdamente longa que aceita um objeto de classe
matrix
e retorna outro objeto. Para chamá-lo, atribua-o a uma variável.Ungolfed:
fonte
mapply
vez deouter
eVectorize
GAP , 246 bytes
Você pode dizer que essa é uma boa codificação pelos for-loops triplos aninhados.
É bem direto. O GAP realmente não tem as mesmas ferramentas para lidar com matrizes que outras linguagens orientadas à matemática. A única coisa realmente usada aqui é o operador determinante incorporado.
ungolfed:
fonte
Verbosidade v2 , 196 bytes
Experimente online!
NB: Atualmente, não funciona no TIO, aguardando uma atração. Deve funcionar offline
Recebe entrada no formulário
((a b)(c d))
para representarApesar de ter um construído para o coadjuvante, a verbosidade do Verbosity ainda o prejudica. Bastante básico como ele funciona, apenas transpõe o adjunto da entrada.
fonte