Ü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



@ 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.

> _> 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.


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.


"Ü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

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.


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.


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!


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


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.


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}

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

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!


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.