La matrice cofactorielle est la transposition de la matrice adjointe . Les éléments de cette matrice sont les cofacteurs de la matrice d'origine.
Le cofacteur (c'est-à-dire l'élément de la matrice du cofacteur à la ligne i et à la colonne j) est le déterminant de la sous-matrice formée en supprimant la ième ligne et la jième colonne de la matrice d'origine, multipliée par (-1) ^ (i + j).
Par exemple, pour la matrice
L'élément de la matrice du cofacteur à la ligne 1 et à la colonne 2 est:
Vous pouvez trouver des informations sur le déterminant d'une matrice et comment les calculer ici .
Défi
Votre objectif est de sortir la matrice de cofacteur d'une matrice d'entrée.
Remarque : Les éléments intégrés qui évaluent les matrices de cofacteurs, ou les matrices d'ajustement, ou les déterminants ou quelque chose de similaire sont autorisés .
Contribution
La matrice peut être entrée comme argument de ligne de commande, comme paramètre de fonction, dans STDIN
ou de la manière la plus appropriée pour le langage que vous utilisez.
La matrice sera formatée comme une liste de listes, chaque sous-liste correspondant à une ligne, qui contient des facteurs ordonnés de gauche à droite. Les lignes sont classées de haut en bas dans la liste.
Par exemple, la matrice
a b
c d
sera représenté par [[a,b],[c,d]]
.
Vous pouvez remplacer les crochets et les virgules par autre chose si cela correspond à votre langue et est raisonnable (par exemple ((a;b);(c;d))
)
Les matrices ne contiendront que des entiers (qui peuvent être négatifs) .
Les matrices seront toujours carrées (c'est-à-dire le même nombre de lignes et de colonnes).
Vous pouvez supposer que l'entrée sera toujours correcte (c'est-à-dire pas de problème de formatage, rien d'autre que des entiers, pas de matrice vide).
Production
La matrice de cofacteur résultante peut être sortie STDOUT
, renvoyée par une fonction, écrite dans un fichier ou tout autre élément similaire qui convient naturellement à la langue que vous utilisez.
La matrice du cofacteur doit être formatée exactement de la même manière que les matrices d'entrée sont données, par exemple [[d,-c],[-b,a]]
. Si vous lisez une chaîne, vous devez retourner / sortir une chaîne dans laquelle la matrice est formatée exactement comme dans l'entrée. Si vous utilisez par exemple une liste de listes comme entrée, vous devez également renvoyer une liste de listes.
Cas de test
- Contribution:
[[1]]
Production: [[1]]
- Contribution:
[[1,2],[3,4]]
Production: [[4,-3],[-2,1]]
- Contribution:
[[-3,2,-5],[-1,0,-2],[3,-4,1]]
Production: [[-8,-5,4],[18,12,-6],[-4,-1,2]]
- Contribution:
[[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]]
Production:
[[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]]
Notation
Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte.
la source
Réponses:
J, 29 octets
Même astuce epsilon / inverse / déterminant. De droite à gauche:
1e_9+
ajoute un epsilon,(-/ .**%.)
est déterminant (-/ .*
) fois inverse (%.
),|:
transpose,<.0.5+
Les manches.la source
Matlab,
4233 octetsUtilisation d'une fonction anonyme:
L'entrée et la sortie sont des matrices (tableaux numériques 2D).
eps
est ajouté au cas où la matrice est singulière. Il est "supprimé" en utilisantround
(le vrai résultat est garanti être un entier).Exemple:
Exemple avec matrice singulière:
Ou essayez-le en ligne dans Octave.
la source
[1,0 ; 0,0]
donne une erreur quand il devrait sortir[0,0 ; 0,1]
mat2str
: "la matrice de cofacteur résultante peut être ... renvoyée d'une fonction"mat2str
eps
est d'environ 1e-16. Cela rend donc la matrice non singulière (mais très mal conditionnée). Le résultat n'est pas exactement entier; doncfix
(arrondir vers zéro) corrige cela. Cela fonctionne à condition que l'erreur ne dépasse pas.5
. Je crains qu'il n'y ait aucune garantie. Pour les très grands nombres entiers, cela peut échouer. J'ai dit que c'était un sale tour :-Pmat2str
c'est nécessaire ici? Pour moi, c'est comme si c'est une fonction, l'entrée est en fait la matrice non formatée. Comme si vous essayezf=...
,f(f(...))
cela ne fonctionnera pas, mais la suppressionmat2str
fait que cela fonctionne bien.Mathematica,
2735 octetsla source
[[1,0],[0,0]]
?R,
12194 octetsIl s'agit d'une fonction absurdement longue qui accepte un objet de classe
matrix
et renvoie un autre de ces objets. Pour l'appeler, affectez-le à une variable.Non golfé:
la source
mapply
au lieu deouter
etVectorize
GAP , 246 octets
Vous pouvez dire que c'est un bon codage par les boucles for imbriquées triples.
C'est assez simple. GAP n'a pas vraiment les mêmes outils pour gérer les matrices que les autres langages orientés mathématiques. La seule chose vraiment utilisée ici est l'opérateur de déterminant intégré.
non golfé:
la source
Verbosité v2 , 196 octets
Essayez-le en ligne!
NB: ne fonctionne pas actuellement sur TIO, en attente d'un pull. Devrait fonctionner hors ligne
Prend une entrée dans le formulaire
((a b)(c d))
pour représenterEn dépit d'avoir une fonction intégrée pour l'adjugate, la verbosité de Verbosity le paralyse toujours. Fonctionnement assez basique, transpose simplement l'adjugate de l'entrée.
la source