Zweryfikuj pary własne


21

W tym wyzwaniu otrzymasz macierz kwadratową A, wektor vi skalar λ. Będziesz musiał ustalić, czy (λ, v)para własna odpowiada A; to znaczy, czy nie Av = λv.

Produkt kropkowy

Iloczyn iloczynu dwóch wektorów jest sumą mnożenia elementarnego. Na przykład iloczyn skalarny następujących dwóch wektorów to:

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

Zauważ, że iloczyn skalarny jest zdefiniowany tylko między dwoma wektorami o tej samej długości.

Mnożenie macierzy-wektorów

Matryca to siatka wartości 2D. mX nmatryca ma mwierszy i nkolumn. Możemy sobie wyobrazić macierz mx njako mwektory długości n(jeśli weźmiemy rzędy).

Mnożenie macierzy-wektora jest definiowane między macierzą mx na nwektorem wielkości . Jeśli pomnożymy macierz mx ni nwektor wielkości , otrzymamy mwektor wielkości . iWartość -ty w wektorze wynik jest kropka produktem i-tym rzędzie matrycy i oryginalnego wektora.

Przykład

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

        1
        3
Let v = 5
        7
        9

Jeśli pomnożymy macierz i wektor Av = x, otrzymamy:

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

Więc rozumiemy Av = x = (95, 145, 195).

Mnożenie przez skalar

Mnożenie skalara (pojedynczej liczby) i wektora jest po prostu mnożeniem elementarnym. Na przykład 3 * (1, 2, 3) = (3, 6, 9). To dość proste.

Wartości własne i wektory własne

Biorąc pod uwagę macierz A, mówimy, że λjest to wartość własna odpowiadająca vi vjest wektorem własnym odpowiadającym λ wtedy i tylko wtedy Av = λv . (Gdzie Avjest mnożenie macierz-wektor i λvmnożenie skalarne).

(λ, v) jest parą własną.

Specyfikacja wyzwań

Wkład

Dane wejściowe będą składały się z macierzy, wektora i skalara. Można je wykonać w dowolnej kolejności w dowolnym rozsądnym formacie.

Wydajność

Dane wyjściowe będą miały wartość prawda / fałsz; Prawda jest wtedy i tylko wtedy, gdy skalar i wektor są parą własną z określoną macierzą.

Zasady

  • Obowiązują standardowe luki
  • Jeśli w Twoim języku istnieje wbudowana funkcja weryfikacji pary własnej, nie możesz jej używać.
  • Możesz założyć, że wszystkie liczby są liczbami całkowitymi

Przypadki testowe

 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

Dodam 4x4 później.

Nieczytelne przypadki testowe, które są łatwiejsze do testowania



@MartinEnder Thanks. Początkowo miałem podobne wyzwanie dla matryc o dowolnej wielkości, gdzie miałeś obliczyć podstawę dla każdej unikalnej przestrzeni własnej, ale wciąż jest to w piaskownicy, ponieważ wydaje się to zbyt mylące.
HyperNeutrino

Jeśli dane wejściowe mogą mieć wymiary inne niż 3x3, powinieneś pokryć niektóre z nich w testach.
Martin Ender

1
@HyperNeutrino tak, to nie pomaga ... Nie próbuj mi tego wyjaśniać: Jestem w szkole średniej, uczę się matematyki na GCSE, więc to mnie po prostu straciło.
caird coinheringaahing

1
@ user00001 Jeśli potrzebujesz pomocy, eigenpair-afhrase ją dla Ciebie. : P
mbomb007 27.04.17

Odpowiedzi:


11

Galaretka , 5 bajtów

æ.⁵⁼×

To jest triadyczny, pełny program.

Wypróbuj online!

Jak to działa

æ.⁵⁼×  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.

> _> to jest za krótkie: P Ładna odpowiedź
HyperNeutrino,

6
To szalona rozmowa! : P
Dennis,

Piszesz coś i myślisz „nic nie może być krótsze!”. Następnie pojawia się MATL i zmniejsza o połowę rozmiar kodu. Potem pojawia się Jelly i
dzieli na pół

@HyperNeutrino Nie porównuj jabłek z pomarańczami. Języki gry w golfa mają zaledwie jeden bajt na operację, co zwykle jest rzadkością. Specyfikacja ma trzy operacje (dwie multiplikacje i równość), i pozwalając na dodatkowy bajt do zduplikowania, vmożna się spodziewać zaledwie czterech bajtów.
Sanchises

2
Podoba mi się, jak zarówno Jelly, jak i MATL używają dwóch bajtów do mnożenia macierzy, co oznacza, że ​​ta odpowiedź naprawdę pokazuje, jak dobra jest Jelly przy przyjmowaniu danych wejściowych, przy czym wszystkie pozostałe są równe.
Sanchises

13

Mathematica, 10 bajtów

#2.#==#3#&

Pobiera dane wejściowe {vector, matrix, scalar}i zwraca wartość logiczną.


1
> _> to było zbyt łatwe dla Mathematica. +1: P
HyperNeutrino

9
@HyperNeutrino A teraz czekamy na MATL ...
Martin Ender

2
Otóż ​​MATL pojawił się> _>
HyperNeutrino

1
Jeden z tych momentów, kiedy myślisz, że nic nie może być krótsze, a MATL pojawia się nagle :)
Pan Xcoder

@ Mr.Xcoder A potem pojawia się Jelly.
Steadybox

11

MATL, 7 bajtów

*i2GY*=

Wejścia w kolejności: l, v, A.

Wyjaśnienie:

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

Zaskakująco długa odpowiedź, jeśli mnie pytasz, głównie dlatego, że potrzebowałem sposobu, aby poprawnie uzyskać wszystkie dane wejściowe. Nie sądzę, że możliwe jest mniej niż 5 bajtów, ale byłoby fajnie, gdyby ktoś znalazł rozwiązanie 5 lub 6 bajtów.

Zasadniczo to oblicza l*v==A*v.


„Zaskakująco długi” Spodziewałem się co najmniej 20 bajtów> _> ładnej odpowiedzi: P
HyperNeutrino

2
Cóż, biorąc pod uwagę, że odpowiedź MATLAB miałaby 16 bajtów @(A,v,l)A*v==v*l, wydaje się to dość gadatliwe i mam wrażenie, że 6 powinno wystarczyć, jeśli otrzymam dane nieco mądrzejsze.
Sanchises

Najwyraźniej przyszedł na 38 bajtów, ale jestem prawie pewien, że można go zagrać w golfa.
HyperNeutrino

3
@HyperNeutrino Dodałem własne, aby poprzedni komentarz był prawdziwy. (czy prawdę mówiąc ...?)
Sanchises

6

CJam , 15 bajtów

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

Pobiera dane wejściowe w formularzu vector scalar matrix.

Wypróbuj online!

Wyjaśnienie

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 bajtów

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

Raczej banalna odpowiedź. Definiuje anonimową funkcję pobierającą dane wejściowe i oblicza elementarną równość powstałych wektorów. Pojedyncze zero w logicznej tablicy powoduje, że tablica zmienia się w MATLAB.


Nie zdawałem sobie sprawy z fałszywości np. [true,false]Dzięki za nauczenie mnie =)
błąd

1
@flawr Zobacz odpowiedź Suever (dotyczy również MATLAB). Zasadniczo niemal, ale nie do końca (pusty matrycy []różni) warunkowane all()jest wywoływana na wejściu if, whileitp
Sanchises

2

MATLAB, 38 bajtów

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

Zwraca 1 lub 0.

MATLAB, 30 bajtów

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

Zwroty

1
1
1

jako prawdziwa wartość. Falsy to podobny wektor z dowolną lub wszystkimi wartościami 0 zamiast 1.


Nie znam MATLAB, ale czy isequalmożna skrócić tę funkcję ==?
HyperNeutrino

1
@HyperNeutrino isequalbyłaby potrzebna, jeśli wymagane wyjście truelub falsezamiast truthy lub wartości falsey. W obliczu wyzwania ==rzeczywiście wystarczy.
Sanchises

@HyperNeutrino Zwróci wektor zawierający wyniki elementarnego porównania dwóch wektorów.
Steadybox

W porządku Dobra odpowiedź!
HyperNeutrino

czy anonimowa funkcja nie byłaby krótsza?
Batman

2

C ++, 225 203 bajtów

Dzięki @Cort Ammon i @Julian Wolf za uratowanie 22 bajtów!

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

Wypróbuj online!


1
using std::vector;mógłby oderwać od tego dwa bajty. Kosztuje 18 bajtów, ale może usunąć 4 std::s, oszczędzając 20.
Cort Ammon - Przywróć Monikę

2
jeszcze lepiej, using V=std::vector<float>;lub podobny
Julian Wolf,


2

Python 2.7, 33 bajty

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

dane wejściowe: m = macierz, s = skalar, e = wartość własna. M i s są tablicami liczbowymi


2
Wygląda to dobrze, ale myślę, że musisz podać liczbę bajtów import np, aby była poprawna
DJMcMayhem

1
Poprzednia print(m,s,e)wypowiedź nie pracowali, ponieważ zmienne m, si enie zostały jeszcze przypisane / zdefiniowane. Możesz także usunąć spację po dwukropku. Możesz także usunąć część `as n` i użyć jej numpypóźniej; ponieważ używasz go tylko raz, użycie pełnej nazwy faktycznie oszczędza bajt.
HyperNeutrino,

1
Ok, teraz rozumiem. Dziękuję za sugestie, ściskając co nieco :)
HonzaB

2
Nie powinno być allzamiast any? I myślę, że sto wektor, a nie skalar, chyba że czegoś mi brakuje
Luis Mendo,

1
Jeszcze krótsze byłoby porównywanie reprezentacji ciągów. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Dennis



1

R, 30 25 bajtów

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

Funkcja anonimowa, dość prosta. Zwraca TRUElub FALSE.


0

ok, 12 bajtów

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

To jest funkcja, bierze się [matrix;vector;scalar].

To nie działa w k z tych samych powodów, które 3.0~3daje 0w wyniku.


Następujące działa w k , z 14 bajtami :

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

0

Aksjomat, 27 bajtów

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

ćwiczenia

(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

Nie widziałem tego języka wcześniej, fajna odpowiedź! Czego @Booleanzrobić?
HyperNeutrino

(a = b) @ Boolean oznacza „wybierz operator dozwolony = (typ 1, typ 2), którego wynikiem jest wartość logiczna”; w kilku słowach „a = b” musi być logiczną
RosLuP

0

Python, 26 bajtów

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

ai bsą tablicami liczbowymi, cjest liczbą całkowitą.

Wypróbuj online!


2
Czy wokół są c*bnaprawdę potrzebne?
xnor

Dzięki xxor naprawiono.
Rɪᴋᴇʀ

Działa to tylko w przypadku małych tablic, ponieważ NumPy zawiera duże reprezentacje ciągów tablic.
user2357112 obsługuje Monikę

@ user2357112 przykład? Nie jestem pewny co masz na myśli.
Rɪᴋᴇʀ 27.04.17

Jeśli c*bma więcej niż 1000 elementów, NumPy zastąpi większość elementów .... Próbny.
user2357112 obsługuje Monikę

0

Clojure, 60 bajtów

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

To sprawdza, czy wszystkie delty są zerowe, a tym samym zapada się w zbiorze zerowym. Przykład wywołania:

(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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.