Vérifier les paires propres


21

Dans ce défi, vous recevrez une matrice carrée A, un vecteur vet un scalaire λ. Vous devrez déterminer si(λ, v) une paire propre correspond à A; c'est-à-dire, que ce soit ou non Av = λv.

Produit scalaire

Le produit scalaire de deux vecteurs est la somme de la multiplication par élément. Par exemple, le produit scalaire des deux vecteurs suivants est:

(1, 2, 3) * (4, 5, 6) = 1*4 + 2*5 + 3*6 = 32

Notez que le produit scalaire n'est défini qu'entre deux vecteurs de même longueur.

Multiplication matrice-vecteur

Une matrice est une grille de valeurs 2D. Une matrice mx na des mlignes et des ncolonnes. Nous pouvons imaginer une matrice mx ncomme mvecteurs de longueur n(si nous prenons les lignes).

La multiplication matrice-vecteur est définie entre une matrice mx net un nvecteur taille . Si nous multiplions une matrice mx net un nvecteur taille , nous obtenons un mvecteur taille . lei valeur -th dans le vecteur de résultat est le produit scalaire dui -th ligne de la matrice et du vecteur d'origine.

Exemple

        1 2 3 4 5
Let A = 3 4 5 6 7
        5 6 7 8 9

        1
        3
Let v = 5
        7
        9

Si on multiplie la matrice et le vecteur Av = x , nous obtenons ce qui suit:

x 1 = A T 1 * v /* AT1 means the first row of A; A1 would be the first column */= (1,2,3,4,5) * (1,3,5,7,9) = 1 * 1 + 2 * 3 + 3 * 5 + 4 * 7 + 5 * 9 = 1 + 6 + 15 + 28 + 45 = 95

x 2 = A T 2 * v = (3,4,5,6,7) * (1,3,5,7,9) = 3 * 1 + 4 * 3 + 5 * 5 + 6 * 7 + 7 * 9 = 3 + 12 + 25 + 42 + 63 = 145

x 3 = A T 3 * v = (5,6,7,8,9) * (1,3,5,7,9) = 5 * 1 + 6 * 3 + 7 * 5 + 8 * 7 + 9 * 9 = 5 + 18 + 35 + 56 + 81 = 195

Donc, nous obtenons Av = x = (95, 145, 195) .

Multiplication scalaire

La multiplication d'un scalaire (un nombre unique) et d'un vecteur est simplement une multiplication par élément. Par exemple,3 * (1, 2, 3) = (3, 6, 9) ,. C'est assez simple.

Valeurs propres et vecteurs propres

Étant donné la matrice A, nous disons que λc'est une valeur propre correspondant à vet vest un vecteur propre correspondant à λ si et seulement si Av = λv . (Où Avest la multiplication matrice-vecteur etλv multiplication scalaire).

(λ, v) est une paire propre.

Spécifications du défi

Contribution

L'entrée consistera en une matrice, un vecteur et un scalaire. Ceux-ci peuvent être pris dans n'importe quel ordre dans n'importe quel format raisonnable.

Production

La sortie sera une valeur véridique / fausse; véridique si et seulement si le scalaire et le vecteur sont une paire propre avec la matrice spécifiée.

Règles

  • Des échappatoires standard s'appliquent
  • Si une fonction intégrée de vérification d'une paire propre existe dans votre langue, vous ne pouvez pas l'utiliser.
  • Vous pouvez supposer que tous les nombres sont des entiers

Cas de test

 MATRIX  VECTOR  EIGENVALUE
 2 -3 -1    3
 1 -2 -1    1    1    ->    TRUE
 1 -3  0    0

 2 -3 -1    1
 1 -2 -1    1    -2   ->    TRUE
 1 -3  0    1

 1  6  3    1
 0 -2  0    0    4    ->    TRUE
 3  6  1    1

 1  0 -1    2
-1  1  1    1    7    ->    FALSE
 1  0  0    0

-4 3    1    
 2 1    2    2    ->    TRUE

2    1    2    ->    TRUE

J'ajouterai un 4x4 plus tard.

Cas de test illisibles plus faciles à tester



@MartinEnder Merci. À l'origine, j'avais un défi similaire pour les matrices de taille arbitraire où vous étiez censé calculer une base pour chaque espace eigens unique, mais c'est toujours dans le bac à sable car cela semble trop confus.
HyperNeutrino

Si les entrées peuvent avoir d'autres dimensions que 3x3, vous devez en couvrir une partie dans vos cas de test.
Martin Ender

1
@HyperNeutrino ouais ça n'aide pas ... N'essayez pas de m'expliquer: je suis au lycée et j'étudie les mathématiques pour GCSE donc c'est juste perdu pour moi.
caird coinheringaahing

1
@ user00001 Si vous avez besoin d'aide, eigenpair-aphrase pour vous. : P
mbomb007

Réponses:


11

Gelée , 5 octets

æ.⁵⁼×

Il s'agit d'un programme triadique complet.

Essayez-le en ligne!

Comment ça marche

æ.⁵⁼×  Main link
       Left argument:  v (eigenvector)
       Right argument: λ (eigenvalue)
       Third argument: A (matrix)

  ⁵    Third; yield A.
æ.     Take the dot product of v and A, yielding Av.
    ×  Multiply v and λ component by component, yielding λv.
   ⁼   Test the results to the left and to the right for equality.

> _> c'est trop court: P Belle réponse
HyperNeutrino

6
C'est un discours fou! : P
Dennis

Vous écrivez quelque chose et pensez "rien ne pourrait être plus court!". Puis MATL arrive et divise par deux la taille de votre code. Ensuite, Jelly arrive et réduit de moitié> _>
HyperNeutrino

@HyperNeutrino Ne comparez pas les pommes aux oranges. Les langues de golf ont aussi peu qu'un octet par opération, ce que les langues normales ont rarement. La spécification a trois opérations (deux multiplications et une égalité), et en permettant à un octet supplémentaire de dupliquer, von pourrait attendre aussi peu que quatre octets.
Sanchises

2
J'aime la façon dont Jelly et MATL utilisent deux octets pour la multiplication matricielle, ce qui signifie que cette réponse montre vraiment à quel point Jelly est capable de prendre des entrées, toutes choses étant égales par ailleurs.
Sanchises

13

Mathematica, 10 octets

#2.#==#3#&

Prend l'entrée comme {vector, matrix, scalar}et retourne un booléen.


1
> _> c'était trop facile pour Mathematica. +1: P
HyperNeutrino

9
@HyperNeutrino Et maintenant nous attendons MATL ...
Martin Ender

2
Eh bien MATL est apparu> _>
HyperNeutrino

1
Un de ces moments où vous pensez que rien ne peut être plus court et MATL apparaît soudainement :)
M. Xcoder

@ Mr.Xcoder Et puis Jelly apparaît.
Steadybox

11

MATL, 7 octets

*i2GY*=

Entrées dans l' ordre: l, v, A.

Explication:

*  % implicitly get l and v, multiply.
i  % get A
2G % get second input, i.e., v again
Y* % perform matrix multiplication
=  % test equality of both multiplications

Réponse étonnamment longue, si vous me le demandez, principalement parce que j'avais besoin d'un moyen pour obtenir toutes les entrées correctement. Je ne pense pas que moins de 5 octets soit possible, mais ce serait cool si quelqu'un trouvait une solution à 5 ou 6 octets.

Fondamentalement, cela calcule l*v==A*v.


"Étonnamment long" Je m'attendais à au moins 20 octets> _> bonne réponse cependant: P
HyperNeutrino

2
Eh bien, étant donné que la réponse MATLAB arriverait à 16 octets @(A,v,l)A*v==v*l, cela semble assez verbeux, et j'ai le sentiment que 6 devrait être suffisant si j'obtiens une entrée un peu plus intelligente.
Sanchises

Apparemment, il est entré à 38 octets, mais je suis presque sûr qu'il peut être joué au golf.
HyperNeutrino

3
@HyperNeutrino Ajout du mien pour que le commentaire précédent soit vrai. (ou véridique ...?)
Sanchises

6

CJam , 15 octets

q~W$f.*::+@@f*=

Prend la saisie dans le formulaire vector scalar matrix.

Essayez-le en ligne!

Explication

q~               e# Read and eval the input
  W$             e# Copy the bottom most value (the vector)
    f.*::+       e# Perform element-wise multiplication with each row of the matrix, then
                 e#   sum the results of each (ie dot product with each row) 
          @@     e# Move the resulting vector to the bottom of the stack
            f*   e# Element-wise multiplication of the scalar and the vector
              =  e# Check if the two vectors are equal

5

MATLAB, 16 octets

@(A,v,l)A*v==v*l

Réponse plutôt banale. Définit une fonction anonyme prenant les entrées et calcule l'égalité élément par élément des vecteurs résultants. Un simple zéro dans un tableau logique fait un tableau falsey dans MATLAB.


Je n'étais pas au courant de la fausseté [true,false], par exemple , merci de m'avoir enseigné =)
flawr

1
@flawr Voir ceci réponse de Suever (qui s'applique également à MATLAB). Fondamentalement, un []implicite presque mais pas tout à fait (une matrice vide est différente) all()est appelé à l'entrée de if, whileetc.
Sanchises

2

MATLAB, 38 octets

function r=f(m,v,s);r=isequal(m*v,s*v)

Renvoie 1 ou 0.

MATLAB, 30 octets

function r=f(m,v,s);r=m*v==s*v

Résultats

1
1
1

comme une valeur véridique. Une valeur falsifiée est un vecteur similaire avec une ou toutes les valeurs 0 au lieu de 1.


Je ne connais pas MATLAB, mais la isequalfonction peut-elle être raccourcie ==?
HyperNeutrino

1
@HyperNeutrino isequalserait nécessaire si la sortie requise trueou falseplutôt qu'une valeur véridique ou falsey. À l'heure actuelle, le défi ==est suffisant.
Sanchises

@HyperNeutrino Il retournerait un vecteur contenant les résultats de la comparaison élément par élément des deux vecteurs.
Steadybox

Ah d'accord. Belle réponse cependant!
HyperNeutrino

une fonction annonyme ne serait-elle pas plus courte?
Batman

2

C ++, 225 203 octets

Merci à @Cort Ammon et @Julian Wolf pour avoir économisé 22 octets!

#import<vector>
#define F(v,i)for(i=0;i<v.size();++i)
using V=std::vector<float>;int f(std::vector<V>m,V v,float s){V p;int i,j;F(m,i){p.push_back(0);F(v,j)p[i]+=v[j]*m[i][j];}F(v,i)v[i]*=s;return v==p;}

Essayez-le en ligne!


1
using std::vector;pourrait jouer au golf à deux octets de cela. Il en coûte 18 octets, mais peut supprimer 4 std::s, ce qui permet d'économiser 20.
Cort Ammon - Rétablir Monica

2
mieux encore, using V=std::vector<float>;ou similaire
Julian Wolf


2

Python 2.7, 33 octets

f=lambda m,s,e:all(m.dot(s)==e*s)

entrée: m = matrice, s = scalaire, e = valeur propre. M et s sont des tableaux numpy


2
Cela semble bon, mais je pense que vous devez inclure le nombre d'octets import nppour qu'il soit valide
DJMcMayhem

1
Votre précédente print(m,s,e)déclaration n'aurait pas fonctionné parce que les variables m, set ene sont pas encore affectés / défini. En outre, vous pouvez supprimer l'espace après les deux points. En outre, vous pouvez supprimer la partie `as n` et simplement l'utiliser numpyplus tard; puisque vous ne l'utilisez qu'une seule fois, l'utilisation du nom complet enregistre en fait un octet.
HyperNeutrino

1
OK je comprends maintenant. Merci pour les suggestions, en pressant chaque bit :)
HonzaB

2
Devrait - il pas au alllieu de any? Et je pense que sc'est le vecteur, pas le scalaire, à moins qu'il me manque quelque chose
Luis Mendo

1
Il serait encore plus court de comparer des représentations de chaînes. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Dennis



1

R, 30 25 octets

s=pryr::f(all(a%*%v==λ*v))

Fonction anonyme, assez simple. Renvoie TRUEou FALSE.


0

oK, 12 octets

{y~z%+/y*+x}

C'est une fonction, ça prend [matrix;vector;scalar] .

Cela ne fonctionne pas en k pour les mêmes raisons que cela 3.0~3donne0 en conséquence.


Fonctionne en k , avec 14 octets :

{(y*z)~+/y*+x}

0

Axiome, 27 octets

f(a,b,c)==(a*b=c*b)@Boolean

des exercices

(17) -> m:=matrix[[2,-3,-1],[1,-2,-1],[1,-3,0] ]; v:=matrix[[3],[1],[0]];
(18) -> f(m,v,1)
   (18)  true

(19) -> m:=matrix[[2,-3,-1],[1,-2,-1],[1,-3,0] ]; v:=matrix[[1],[1],[1]];
(20) -> f(m,v,-2)
   (20)  true

(21) -> m:=matrix[[1,6,3],[0,-2,0],[3,6,1] ]; v:=matrix[[1],[0],[1]];
(22) -> f(m,v,4)
   (22)  true

(23) -> m:=matrix[[1,0,-1],[-1,1,1],[1,0,0] ]; v:=matrix[[2],[1],[0]];
(24) -> f(m,v,7)
   (24)  false

(25) -> m:=matrix[[-4,3],[2,1] ]; v:=matrix[[1],[2]];
(26) -> f(m,v,2)
   (26)  true

(27) -> f(2,1,2)
   (27)  true

Je n'ai jamais vu cette langue auparavant, belle réponse! Que fait le@Boolean il?
HyperNeutrino

(a = b) @Boolean signifierait "choisir parmi l'opérateur = autorisé (type1, type2) celui dont le résultat est booléen"; en quelques mots "a = b" doit être booléen
RosLuP

0

Python, 26 octets

lambda a,b,c:c*b==a.dot(b)

aet bsont des tableaux numpy, cest un entier.

Essayez-le en ligne!


2
Les parens sont-ils c*bvraiment nécessaires?
xnor

@xnor merci, corrigé.
Rɪᴋᴇʀ

Cela ne fonctionne que pour les petits tableaux, car NumPy raccourcit les grandes représentations de chaîne de tableau.
user2357112 prend en charge Monica

@ user2357112 exemple? Je ne sais pas ce que tu veux dire.
Rɪᴋᴇʀ

S'il c*ba plus de 1000 éléments, NumPy remplacera la plupart des éléments par .... Démo.
user2357112 prend en charge Monica

0

Clojure, 60 octets

#(=(set(map(fn[a v](apply -(* v %3)(map * a %2)))% %2))#{0})

Cela vérifie que tous les deltas sont nuls, se repliant ainsi dans l'ensemble de zéro. Exemple d'appel:

(def f #(=(set(map(fn[a v](apply -(* v %3)(map * a %2)))% %2))#{0}))
(f [[1 6 3][0 -2 0][3 6 1]] [1 0 1] 4)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.