Überprüfen Sie die Eigenpaare

21

In dieser Herausforderung erhalten Sie eine quadratische Matrix A, einen Vektor vund einen Skalar λ. Sie müssen feststellen, ob (λ, v)ein Eigenpaar entspricht A; das heißt, ob oder nicht Av = λv.

Skalarprodukt

Das Skalarprodukt zweier Vektoren ist die Summe der elementweisen Multiplikation. Beispielsweise ist das Skalarprodukt der folgenden zwei Vektoren:

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

Beachten Sie, dass das Skalarprodukt nur zwischen zwei Vektoren gleicher Länge definiert wird.

Matrix-Vektor-Multiplikation

Eine Matrix ist ein 2D-Wertegitter. Eine mx- nMatrix besteht aus mZeilen und nSpalten. Wir können uns eine mx- nMatrix als mVektoren der Länge vorstellen n(wenn wir die Zeilen nehmen).

Die Matrix-Vektor-Multiplikation wird zwischen einer mx- nMatrix und einem Größenvektor ndefiniert. Wenn wir eine mx- nMatrix und einen Größenvektor multiplizieren n, erhalten wir einen Größenvektor m. Der i-te Wert im Ergebnisvektor ist das Skalarprodukt der i-ten Zeile der Matrix und des Originalvektors.

Beispiel

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

        1
        3
Let v = 5
        7
        9

Wenn wir die Matrix und den Vektor multiplizieren Av = x, erhalten wir Folgendes:

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 * 6 * 1 + 3 + 5 + 7 * 8 * 7 + 9 * 9 = 5 + 18 + 35 + 56 + 81 = 195

Also bekommen wir Av = x = (95, 145, 195).

Skalarmultiplikation

Die Multiplikation eines Skalars (einer einzelnen Zahl) und eines Vektors ist einfach eine elementweise Multiplikation. Zum Beispiel 3 * (1, 2, 3) = (3, 6, 9). Es ist ziemlich einfach.

Eigenwerte und Eigenvektoren

In Anbetracht der Matrix Asagen wir, dass dies λein Eigenwert ist, der genau dann entspricht vund vein Eigenvektor ist, der λ genau dann entspricht, wennAv = λv . (Wo Avist Matrix-Vektor-Multiplikation und λvist Skalarmultiplikation).

(λ, v) ist ein Eigenpaar.

Herausforderungsspezifikationen

Eingang

Die Eingabe besteht aus einer Matrix, einem Vektor und einem Skalar. Diese können in beliebiger Reihenfolge in einem angemessenen Format abgerufen werden.

Ausgabe

Die Ausgabe ist ein wahrer / falscher Wert. genau dann wahr, wenn der Skalar und der Vektor ein Eigenpaar mit der angegebenen Matrix sind.

Regeln

  • Es gelten Standardlücken
  • Wenn in Ihrer Sprache eine integrierte Funktion zum Überprüfen eines Eigenpaars vorhanden ist, können Sie diese möglicherweise nicht verwenden.
  • Sie können davon ausgehen, dass alle Zahlen ganze Zahlen sind

Testfälle

 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

Ich werde später einen 4x4 hinzufügen.

Nicht lesbare Testfälle, die einfacher zu testen sind

HyperNeutrino
quelle
Verbunden.
Martin Ender
@ MartinEnder Danke. Ursprünglich hatte ich eine ähnliche Herausforderung für beliebig große Matrizen, bei der Sie eine Basis für jeden eindeutigen Eigenraum berechnen sollten, aber das ist immer noch im Sandkasten, weil es zu verwirrend erscheint.
HyperNeutrino
Wenn Eingaben andere Dimensionen als 3x3 haben können, sollten Sie einen Teil davon in Ihren Testfällen abdecken.
Martin Ender
1
@HyperNeutrino Ja, das hilft nicht ... Versuchen Sie nicht, es mir zu erklären: Ich bin auf der Highschool und studiere Mathematik für GCSE, also ist es einfach verloren für mich.
Caird Coinheringaahing
1
@ user00001 Wenn Sie Hilfe benötigen, verwenden Sie die Eigenpaar-Formulierung für Sie. : P
mbomb007

Antworten:

11

Gelee , 5 Bytes

æ.⁵⁼×

Dies ist ein dreiköpfiges Programm.

Probieren Sie es online!

Wie es funktioniert

æ.⁵⁼×  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.
Dennis
quelle
> _> das ist zu kurz: P Schöne Antwort
HyperNeutrino
6
Das ist verrücktes Gerede! : P
Dennis
Sie schreiben etwas und denken, "nichts könnte kürzer sein!". Dann kommt MATL und halbiert Ihre Codegröße. Dann kommt Jelly und halbiert das
HyperNeutrino
@HyperNeutrino Vergleichen Sie Äpfel nicht mit Orangen. Golfsprachen haben nur ein Byte pro Operation, etwas, das normale Sprachen selten haben. Die Spezifikation hat drei Operationen (zwei Multiplikationen und eine Gleichheit), und unter Berücksichtigung eines zusätzlichen Bytes, das man duplizieren kann, sind vnur vier Bytes zu erwarten.
Sanchises
2
Mir gefällt, wie sowohl Jelly als auch MATL zwei Bytes für die Matrixmultiplikation verwenden, was bedeutet, dass diese Antwort wirklich zeigt, wie gut Jelly Eingaben akzeptiert, wenn alle anderen gleich sind.
Sanchises
13

Mathematica, 10 Bytes

#2.#==#3#&

Nimmt Eingaben wie {vector, matrix, scalar}und gibt einen Booleschen Wert zurück.

Martin Ender
quelle
1
> _> das war für Mathematica zu einfach. +1: P
HyperNeutrino
9
@HyperNeutrino Und jetzt warten wir auf MATL ...
Martin Ender
2
Nun, MATL ist erschienen> _>
HyperNeutrino
1
Einer dieser Momente, in denen Sie denken, dass nichts kürzer sein kann und MATL plötzlich auftaucht :)
Mr. Xcoder
@ Mr.Xcoder Und dann taucht Jelly auf.
Steadybox
11

MATL, 7 Bytes

*i2GY*=

Eingänge in dieser Reihenfolge: l, v, A.

Erläuterung:

*  % 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

Überraschend lange Antwort, wenn Sie mich fragen, vor allem, weil ich einen Weg brauchte, um alle Eingaben richtig zu machen. Ich denke nicht, dass weniger als 5 Bytes möglich sind, aber es wäre cool, wenn jemand eine 5 oder 6 Byte Lösung finden würde.

Grundsätzlich berechnet dies l*v==A*v.

Sanchises
quelle
"Überraschend lang" Ich hatte allerdings mindestens 20 Bytes erwartet> _> nette Antwort: P
HyperNeutrino
2
Nun, wenn man bedenkt, dass die MATLAB-Antwort bei 16 Bytes eingehen würde @(A,v,l)A*v==v*l, scheint dies ziemlich ausführlich zu sein, und ich habe das Gefühl, dass 6 eine Menge sein sollte, wenn ich die Eingabe etwas schlauer bekomme.
Sanchises
Anscheinend ist es bei 38 Bytes angekommen, aber ich bin mir ziemlich sicher, dass man damit Golf spielen kann.
HyperNeutrino
3
@HyperNeutrino Fügte meine eigene hinzu, um den vorherigen Kommentar wahr zu machen. (oder wahrheitsgemäß ...?)
Sanchises
6

CJam , 15 Bytes

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

Nimmt Eingaben in das Formular auf vector scalar matrix .

Probieren Sie es online!

Erläuterung

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
Geschäfts-Katze
quelle
5

MATLAB, 16 Bytes

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

Eher triviale Antwort. Definiert eine anonyme Funktion, die die Eingaben verwendet und die elementweise Gleichheit der resultierenden Vektoren berechnet. Eine einzelne Null in einem logischen Array macht ein Array in MATLAB falsch.

Sanchises
quelle
War mir der Unrichtigkeit von zB nicht bewusst [true,false], danke, dass du mich unterrichtet hast =)
flawr
1
@flawr Siehe diese Antwort von Suever (gilt auch für MATLAB). Im Grunde eine fast-but-not-quite (leere Matrix []unterscheidet) implizit all()auf dem Eingang aufgerufen wird if, whileusw.
Sanchises
2

MATLAB, 38 Bytes

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

Gibt 1 oder 0 zurück.

MATLAB, 30 Bytes

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

Kehrt zurück

1
1
1

als ein wahrer Wert. Ein falscher Wert ist ein ähnlicher Vektor mit einem oder allen Werten 0 anstelle von 1.

Steadybox
quelle
Ich kenne MATLAB nicht, aber kann die isequalFunktion auf verkürzt werden ==?
HyperNeutrino
1
@HyperNeutrino isequalwürde benötigt, wenn die Ausgabe erforderlich ist trueoder falseeher als ein wahrer oder falscher Wert. Wie die Herausforderung steht, ==ist in der Tat genug.
Sanchises
@HyperNeutrino Gibt einen Vektor zurück, der die Ergebnisse des elementweisen Vergleichs der beiden Vektoren enthält.
Steadybox
Oh ok. Gute Antwort!
HyperNeutrino
Wäre eine anonyme Funktion nicht kürzer?
Batman
2

C ++ 225 203 Bytes

Vielen Dank an @Cort Ammon und @Julian Wolf für das Speichern von 22 Bytes!

#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;}

Probieren Sie es online!

Steadybox
quelle
1
using std::vector;könnte zwei Bytes davon Golf spielen. Es kostet 18 Bytes, kann aber 4 std::s entfernen , wodurch 20 gespart werden.
Cort Ammon - Reinstate Monica
2
besser noch, using V=std::vector<float>;oder ähnlich
Julian Wolf
2

Python 2.7, 33 Bytes

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

Eingabe: m = Matrix, s = Skalar, e = Eigenwert. M und s sind numpy Arrays

HonzaB
quelle
2
Das sieht gut aus, aber ich denke, Sie müssen die import np
Byteanzahl von angeben
1
Ihre frühere print(m,s,e)Aussage gearbeitet haben würde nicht , weil die Variablen m, sund ewurden noch nicht zugewiesen / definiert. Sie können auch das Leerzeichen nach dem Doppelpunkt entfernen. Sie können auch den 'as n'-Teil entfernen und ihn numpyspäter verwenden. Da Sie es nur einmal verwenden, wird durch die Verwendung des vollständigen Namens tatsächlich ein Byte gespeichert.
HyperNeutrino
1
Okay, ich verstehe jetzt. Vielen Dank für die Vorschläge, drückte jedes bisschen :)
HonzaB
2
Sollte es nicht allstatt sein any? Und ich denke, sist der Vektor, nicht der Skalar, es sei denn, ich vermisse etwas
Luis Mendo
1
Es wäre sogar noch kürzer, Zeichenfolgendarstellungen zu vergleichen. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Dennis
1

R 30 25 Bytes

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

Anonyme Funktion, ziemlich unkompliziert. Rückgabe TRUEoder FALSE.

rturnbull
quelle
0

ok, 12 bytes

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

Dies ist eine Funktion, die es übernimmt [matrix;vector;scalar] .

Dies funktioniert in k nicht aus den gleichen Gründen, 3.0~3die sich daraus 0ergeben.


Das Folgende funktioniert in k mit 14 Bytes :

{(y*z)~+/y*+x}
zgrep
quelle
0

Axiom, 27 Bytes

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

Übungen

(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
RosLuP
quelle
Ich habe diese Sprache noch nie gesehen, nette Antwort! Was macht der @Boolean?
HyperNeutrino
(a = b) @Boolean würde bedeuten "wähle zwischen erlaubt = Operator (Typ1, Typ2), dessen Ergebnis Boolean ist"; in wenigen Worten muss "a = b" boolesch sein
RosLuP
0

Python, 26 Bytes

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

aund bsind numpy Arrays, cist eine ganze Zahl.

Probieren Sie es online!

Rɪᴋᴇʀ
quelle
2
Sind die Eltern c*beigentlich nötig?
XNOR
@ xnoder danke, behoben.
14.
Dies funktioniert nur bei kleinen Arrays, da NumPy große Array-Zeichenfolgendarstellungen abkürzt.
user2357112 unterstützt Monica
@ user2357112 Beispiel? Ich bin mir nicht sicher was du meinst.
27.
Wenn c*bmehr als 1000 Elemente vorhanden sind, ersetzt NumPy die meisten Elemente durch .... Demo.
user2357112 unterstützt Monica
0

Clojure, 60 Bytes

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

Dies prüft, ob alle Deltas Null sind, und kollabiert somit in die Menge von Null. Aufrufbeispiel:

(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)
NikoNyrh
quelle