Verifica Eigenpairs


21

In questa sfida, ti verrà data una matrice quadrata A, un vettore ve uno scalare λ. Ti verrà richiesto di determinare se (λ, v)è una eigenpair corrispondente a A; cioè, indipendentemente dal fatto Av = λv.

Prodotto a punti

Il prodotto punto di due vettori è la somma della moltiplicazione degli elementi. Ad esempio, il prodotto punto dei seguenti due vettori è:

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

Si noti che il prodotto punto è definito solo tra due vettori della stessa lunghezza.

Moltiplicazione matrice-vettore

Una matrice è una griglia di valori 2D. Una matrice mx nha mrighe e ncolonne. Possiamo immaginare una matrice mx ncome mvettori di lunghezza n(se prendiamo le righe).

La moltiplicazione Matrix-Vector è definita tra una matrice mx ne un nvettore size . Se moltiplichiamo una matrice mxe nun nvettore di dimensioni , otteniamo un mvettore di dimensioni . Il ivalore -th nel vettore risultato è il prodotto punto della iriga -th della matrice e del vettore originale.

Esempio

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

        1
        3
Let v = 5
        7
        9

Se moltiplichiamo la matrice e il vettore Av = x, otteniamo quanto segue:

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

Quindi otteniamo Av = x = (95, 145, 195).

Moltiplicazione scalare

La moltiplicazione di uno scalare (un singolo numero) e di un vettore è semplicemente una moltiplicazione basata sull'elemento. Ad esempio 3 * (1, 2, 3) = (3, 6, 9),. È abbastanza semplice.

Autovalori ed autovettori

Data la matrice A, diciamo che λè un autovalore corrispondente a ved vè un autovettore corrispondente a λ se e solo se Av = λv . (Dov'è la Avmoltiplicazione matrice-vettore e λvla moltiplicazione scalare).

(λ, v) è una eigenpair.

Specifiche della sfida

Ingresso

L'input consisterà in una matrice, un vettore e uno scalare. Questi possono essere presi in qualsiasi ordine in qualsiasi formato ragionevole.

Produzione

L'output sarà un valore di verità / falsa; in verità se e solo se lo scalare e il vettore sono una autofair con la matrice specificata.

Regole

  • Si applicano scappatoie standard
  • Se esiste un built-in per la verifica di una eigenpair nella tua lingua, non puoi usarlo.
  • Si può presumere che tutti i numeri siano numeri interi

Casi 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

Aggiungerò un 4x4 più tardi.

Casi di test illeggibili che sono più facili per i test



@MartinEnder Grazie. Inizialmente avevo una sfida simile per matrici di dimensioni arbitrarie in cui dovevi calcolare una base per ogni spazio unico, ma è ancora nella sandbox perché sembra troppo confuso.
HyperNeutrino,

Se gli input possono avere dimensioni diverse da 3x3, è necessario coprirne alcuni nei casi di test.
Martin Ender,

1
@HyperNeutrino sì, questo non aiuta ... Non provare a spiegarmelo: sono al liceo a studiare matematica per GCSE, quindi mi ha perso.
caird coinheringaahing

1
@ user00001 Se hai bisogno di aiuto, eigenpair-aphrase per te. : P
mbomb007,

Risposte:


11

Gelatina , 5 byte

æ.⁵⁼×

Questo è un programma triadico e completo.

Provalo online!

Come funziona

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

> _> troppo breve: P Bella risposta
HyperNeutrino,

6
È un discorso folle! : P
Dennis,

Scrivi qualcosa e pensi "niente potrebbe essere più breve!". Quindi arriva MATL e dimezza la dimensione del codice. Quindi Jelly arriva e dimezza questo> _>
HyperNeutrino il

@HyperNeutrino Non confrontare le mele con le arance. Le lingue da golf hanno un solo byte per operazione, qualcosa che le lingue normali hanno raramente. La specifica ha tre operazioni (due moltiplicazioni e un'uguaglianza) e consentire un ulteriore byte per duplicare vuno potrebbe prevedere fino a quattro byte.
Sanchises,

2
Mi piace come sia Jelly che MATL utilizzino due byte per la moltiplicazione di matrici, il che significa che questa risposta mostra davvero quanto sia brava Jelly nel prendere input, a parità di tutto il resto.
Sanchises,

13

Mathematica, 10 byte

#2.#==#3#&

Accetta input come {vector, matrix, scalar}e restituisce un valore booleano.


1
> _> era troppo facile per Mathematica. +1: P
HyperNeutrino

9
@HyperNeutrino E ora aspettiamo MATL ...
Martin Ender,

2
Bene MATL è apparso> _>
HyperNeutrino il

1
Uno di quei momenti in cui pensi che nulla possa essere più breve e MATL si apre all'improvviso :)
Mr. Xcoder

@ Mr.Xcoder E poi Jelly si presenta.
Steadybox

11

MATL, 7 byte

*i2GY*=

Ingressi in ordine: l, v, A.

Spiegazione:

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

Risposta sorprendentemente lunga, se me lo chiedi, soprattutto perché avevo bisogno di un modo per ottenere correttamente tutti gli input. Non penso che sia possibile meno di 5 byte, ma sarebbe bello se qualcuno trovasse una soluzione a 5 o 6 byte.

Fondamentalmente, questo calcola l*v==A*v.


"Sorprendentemente lungo" Mi aspettavo almeno 20 byte> _> bella risposta però: P
HyperNeutrino

2
Bene, considerando che la risposta MATLAB arriverebbe a 16 byte @(A,v,l)A*v==v*l, questo sembra abbastanza dettagliato, e ho la sensazione che 6 dovrebbe essere abbondante se ottengo l'input in qualche modo più intelligente.
Sanchises,

Apparentemente è arrivato a 38 byte, ma sono abbastanza sicuro che possa essere golfato.
HyperNeutrino,

3
@HyperNeutrino Aggiunto il mio per rendere vero il commento precedente. (o verità ...?)
Sanchises,

6

CJam , 15 byte

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

Accetta input nel modulo vector scalar matrix.

Provalo online!

Spiegazione

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 byte

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

Risposta piuttosto banale. Definisce una funzione anonima che accetta gli input e calcola l'uguaglianza saggia degli elementi dei vettori risultanti. Un singolo zero in una matrice logica rende falsa una matrice in MATLAB.


Non ero a conoscenza della falsità di ad esempio [true,false], grazie per avermi insegnato =)
flawr

1
@flawr Vedi questa risposta di Suever (che è applicabile anche a MATLAB). Fondamentalmente, un input quasi-ma-non-abbastanza (la matrice vuota []è diversa) all()è chiamato sull'input di if, whileecc.
Sanchises

2

MATLAB, 38 byte

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

Restituisce 1 o 0.

MATLAB, 30 byte

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

ritorna

1
1
1

come un valore sincero. Un valore errato è un vettore simile con uno o tutti i valori 0 anziché 1.


Non conosco MATLAB, ma la isequalfunzione può essere abbreviata ==?
HyperNeutrino,

1
@HyperNeutrino isequalsarebbe necessario se l'output richiesto trueo falsepiuttosto che un valore di verità o falsità. Allo stato attuale della sfida, ==è davvero abbastanza.
Sanchises,

@HyperNeutrino Restituirebbe un vettore contenente i risultati del confronto elementwise dei due vettori.
Steadybox

Oh ok. Bella risposta però!
HyperNeutrino,

una funzione anonima non sarebbe più breve?
Batman,

2

C ++, 225 203 byte

Grazie a @Cort Ammon e @Julian Wolf per aver salvato 22 byte!

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

Provalo online!


1
using std::vector;potrebbe golf a due byte da questo. Costa 18 byte, ma può rimuovere 4 std::s, risparmiando 20.
Cort Ammon - Ripristina Monica

2
meglio ancora, using V=std::vector<float>;o simile
Julian Wolf,


2

Python 2.7, 33 byte

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

input: m = matrice, s = scalare, e = autovalore. M e s sono matrici intorpidite


2
Sembra buono, ma penso che sia necessario includere il conteggio dei byte import npaffinché sia ​​valido
DJMcMayhem

1
Il tuo precedente print(m,s,e)dichiarazione non avrebbe funzionato perché le variabili m, se enon erano ancora assegnato / definito. Inoltre, puoi rimuovere lo spazio dopo i due punti. Inoltre, puoi rimuovere la parte `as n` e usarla in numpyseguito; poiché lo usi solo una volta, l'uso del nome completo salva effettivamente un byte.
HyperNeutrino,

1
Ok ora capisco. Grazie per i suggerimenti, spremendo ogni bit :)
HonzaB

2
Non dovrebbe essere allinvece di any? E io pensos sia il vettore, non lo scalare, a meno che non mi manchi qualcosa
Luis Mendo,

1
Sarebbe ancora più breve confrontare le rappresentazioni di stringhe. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/...
Dennis



1

R, 30 25 byte

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

Funzione anonima, abbastanza semplice. Restituisce TRUEo FALSE.


0

OK, 12 byte

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

Questa è una funzione, accetta [matrix;vector;scalar] .

Questo non funziona in k per gli stessi motivi che 3.0~3danno0 come risultato.


Il seguente funziona in k , con 14 byte :

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

0

Assioma, 27 byte

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

esercizi

(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

Non ho mai visto questa lingua prima, bella risposta! Che cosa @Booleanfa?
HyperNeutrino,

(a = b) @Boolean significherebbe "scegli tra ammessi = operatore (tipo1, tipo2) quello il cui risultato è Booleano"; in poche parole "a = b" deve essere booleano
RosLuP

0

Python, 26 byte

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

ae bsono matrici intorpidite, cè un numero intero.

Provalo online!


2
I genitori intorno sono c*beffettivamente necessari?
xnor

@xnor grazie, risolto.
Rɪᴋᴇʀ

Questo funziona solo per array di piccole dimensioni, poiché NumPy modifica le rappresentazioni di stringhe di array di grandi dimensioni.
user2357112 supporta Monica il

Esempio @ user2357112? Non sono sicuro di cosa intendi.
Rɪᴋᴇʀ

Se c*bha più di 1000 elementi, NumPy sostituirà la maggior parte degli elementi con .... Demo.
user2357112 supporta Monica il

0

Clojure, 60 byte

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

Questo verifica che tutti i delta siano zero, quindi collassando nel set di zero. Esempio di chiamata:

(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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.