Verifikasi pasangan Eigen

21

Dalam tantangan ini, Anda akan diberikan matriks kuadrat A, vektor v, dan skalar λ. Anda akan diminta untuk menentukan apakah (λ, v)ada eigenpair yang sesuai dengan A; Yaitu, apakah atau tidak Av = λv.

Produk titik

Produk titik dari dua vektor adalah jumlah dari perkalian elemen-bijaksana. Misalnya, produk titik dari dua vektor berikut adalah:

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

Perhatikan bahwa produk titik hanya didefinisikan antara dua vektor dengan panjang yang sama.

Perkalian Matriks-Vektor

Matriks adalah kotak nilai 2D. Sebuah mx nmatriks memiliki mbaris dan nkolom. Kita dapat membayangkan sebuah matriks mx nsebagai mvektor panjang n(jika kita mengambil baris).

Multiplikasi Matriks-Vektor didefinisikan antara mx nmatriks dan nvektor ukuran . Jika kita mengalikan mx nmatriks dan nvektor ukuran , kita memperoleh mvektor ukuran . Nilai i-th dalam vektor hasil adalah produk titik dari ibaris-ke-matriks dan vektor asli.

Contoh

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

        1
        3
Let v = 5
        7
        9

Jika kita mengalikan matriks dan vektor Av = x, kita mendapatkan yang berikut:

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

Jadi, kita dapatkan Av = x = (95, 145, 195).

Penggandaan Skalar

Perkalian skalar (angka tunggal) dan vektor hanyalah perkalian elemen-bijaksana. Sebagai contoh 3 * (1, 2, 3) = (3, 6, 9),. Ini cukup mudah.

Nilai eigen dan vektor Eigen

Mengingat matriks A, kita mengatakan bahwa itu λadalah nilai eigen yang sesuai dengan vdan vmerupakan vektor eigen yang sesuai dengan λ jika dan hanya jika Av = λv . (Dimana Avmultiplikasi matriks-vektor dan λvmultiplikasi skalar).

(λ, v) adalah eigenpair.

Spesifikasi Tantangan

Memasukkan

Input akan terdiri dari matriks, vektor, dan skalar. Ini dapat diambil dalam urutan apa pun dalam format apa pun yang wajar.

Keluaran

Output akan menjadi nilai true / falsy; benar jika dan hanya jika skalar dan vektor adalah eigenpair dengan matriks yang ditentukan.

Aturan

  • Celah standar berlaku
  • Jika built-in untuk memverifikasi eigenpair ada dalam bahasa Anda, Anda mungkin tidak menggunakannya.
  • Anda dapat mengasumsikan bahwa semua angka adalah bilangan bulat

Uji Kasus

 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

Saya akan menambahkan 4x4 nanti.

Kasus Uji yang Tidak Dapat Dibaca yang lebih mudah untuk pengujian

HyperNeutrino
sumber
Terkait
Martin Ender
@ MartinEnder Terima kasih. Saya awalnya memiliki tantangan yang sama untuk matriks ukuran sewenang-wenang di mana Anda dimaksudkan untuk menghitung dasar untuk setiap eigenspace unik tapi itu masih ada di kotak pasir karena tampaknya terlalu membingungkan.
HyperNeutrino
Jika input dapat memiliki dimensi selain 3x3, Anda harus membahas beberapa hal dalam kasus uji Anda.
Martin Ender
1
@HyperNeutrino ya itu tidak membantu ... Jangan mencoba menjelaskannya kepada saya: Saya di sekolah menengah belajar matematika untuk GCSE sehingga hanya hilang pada saya.
caird coinheringaahing
1
@ user00001 Jika Anda butuh bantuan, sesuaikan eigenpair untuk Anda. : P
mbomb007

Jawaban:

11

Jelly , 5 byte

æ.⁵⁼×

Ini adalah triadic, program lengkap.

Cobalah online!

Bagaimana itu bekerja

æ.⁵⁼×  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
sumber
> _> ini terlalu pendek: P Jawaban yang bagus
HyperNeutrino
6
Itu bicara gila! : P
Dennis
Anda menulis sesuatu, dan berpikir "tidak ada yang bisa lebih pendek!". Kemudian MATL datang dan membagi dua ukuran kode Anda. Kemudian Jelly datang dan membagi dua itu> _>
HyperNeutrino
@HyperNeutrino Jangan bandingkan apel dengan jeruk. Bahasa golf hanya memiliki satu byte per operasi, sesuatu yang jarang dimiliki oleh bahasa normal. Spec memiliki tiga operasi (dua perkalian dan kesetaraan), dan memungkinkan untuk byte tambahan untuk menduplikasi vsatu bisa berharap hanya empat byte.
Sanchises
2
Saya suka bagaimana Jelly dan MATL menggunakan dua byte untuk perkalian matriks, yang berarti bahwa jawaban ini benar-benar menunjukkan seberapa bagus Jelly dalam mengambil input, semuanya sama.
Sanchises
13

Mathematica, 10 byte

#2.#==#3#&

Mengambil input like {vector, matrix, scalar}dan mengembalikan boolean.

Martin Ender
sumber
1
> _> ini terlalu mudah untuk Mathematica. +1: P
HyperNeutrino
9
@HyperNeutrino Dan sekarang kita menunggu MATL ...
Martin Ender
2
Nah MATL telah muncul> _>
HyperNeutrino
1
Salah satu momen ketika Anda berpikir tidak ada yang lebih pendek dan MATL tiba-tiba muncul :)
Mr. Xcoder
@ Mr.Xcoder Dan kemudian Jelly muncul.
Steadybox
11

MATL, 7 byte

*i2GY*=

Masukan dalam rangka: l, v, A.

Penjelasan:

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

Jawaban yang sangat panjang, jika Anda bertanya kepada saya, sebagian besar karena saya membutuhkan cara untuk mendapatkan semua input dengan benar. Saya tidak berpikir bahwa kurang dari 5 byte adalah mungkin, tetapi akan lebih keren jika seseorang menemukan solusi 5 atau 6 byte.

Pada dasarnya, ini menghitung l*v==A*v.

Sanchises
sumber
"Sangat lama" Saya mengharapkan setidaknya 20 byte> _> jawaban yang bagus: P
HyperNeutrino
2
Nah, mengingat bahwa jawaban MATLAB akan datang pada 16 byte @(A,v,l)A*v==v*l, ini tampaknya sangat bertele-tele, dan saya punya perasaan 6 harus banyak jika saya mendapatkan input yang agak lebih pintar.
Sanchises
Rupanya itu datang di 38 byte tetapi saya cukup yakin itu bisa di-down golf.
HyperNeutrino
3
@HyperNeutrino Menambahkan komentar saya sendiri untuk menjadikan komentar sebelumnya benar. (atau jujur ​​...?)
Sanchises
6

CJam , 15 byte

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

Mengambil input dalam formulir vector scalar matrix.

Cobalah online!

Penjelasan

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
Kucing Bisnis
sumber
5

MATLAB, 16 byte

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

Jawaban yang agak sepele. Menentukan fungsi anonim yang mengambil input, dan menghitung persamaan elemen-bijaksana dari vektor yang dihasilkan. Satu nol dalam array logis membuat array falsey di MATLAB.

Sanchises
sumber
Tidak menyadari kepalsuan eg [true,false], terima kasih telah mengajari saya =)
flawr
1
@ flawr Lihat jawaban ini oleh Suever (yang juga berlaku untuk MATLAB). Pada dasarnya, []implisit yang hampir-tetapi-tidak-cukup (matriks kosong berbeda) all()dipanggil pada input if, whiledll.
Sanchises
2

MATLAB, 38 byte

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

Mengembalikan 1 atau 0.

MATLAB, 30 byte

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

Kembali

1
1
1

sebagai nilai kebenaran. Nilai falsy adalah vektor yang sama dengan setiap atau semua nilai 0 bukan 1.

Steadybox
sumber
Saya tidak tahu MATLAB, tetapi bisakah isequalfungsinya disingkat ==?
HyperNeutrino
1
@HyperNeutrino isequalakan dibutuhkan jika output diperlukan trueatau falsebukan nilai truey atau falsey. Sebagai tantangan berdiri, ==memang sudah cukup.
Sanchises
@HyperNeutrino Ini akan mengembalikan vektor yang berisi hasil perbandingan elemen dari dua vektor.
Steadybox
Oh baiklah. Jawaban yang bagus!
HyperNeutrino
bukankah fungsi anonim lebih pendek?
Batman
2

C ++, 225 203 byte

Terima kasih kepada @Cort Ammon dan @Julian Wolf yang telah menghemat 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;}

Cobalah online!

Steadybox
sumber
1
using std::vector;bisa bermain golf dua byte dari ini. Harganya 18 byte, tetapi dapat menghapus 4 std::detik, menghemat 20.
Cort Ammon - Reinstate Monica
2
lebih baik lagi, using V=std::vector<float>;atau serupa
Julian Wolf
2

Julia, 17 byte

(a,b,c)->a*b==b*c

Cobalah online!

Rɪᴋᴇʀ
sumber
2

Python 2.7, 33 byte

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

input: m = matriks, s = skalar, e = nilai eigen. M dan s adalah array numpy

HonzaB
sumber
2
Ini terlihat bagus, tapi saya pikir Anda perlu memasukkan hitungan byte import npagar valid
DJMcMayhem
1
Anda sebelumnya print(m,s,e)pernyataan tidak akan bekerja karena variabel m, sdan eyang belum ditugaskan / didefinisikan. Anda juga dapat menghapus ruang setelah titik dua. Anda juga dapat menghapus bagian `sebagai n` dan hanya menggunakan numpynanti; karena Anda hanya menggunakannya sekali, menggunakan nama lengkap sebenarnya menghemat satu byte.
HyperNeutrino
1
Ok saya mengerti sekarang. Terima kasih atas sarannya,
remaslah
2
Bukankah seharusnya allbukan any? Dan saya pikir itu sadalah vektor, bukan skalar, kecuali jika saya melewatkan sesuatu
Luis Mendo
1
Akan lebih pendek untuk membandingkan representasi string. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/...
Dennis
1

05AB1E , 11 byte

vy²*O})²³*Q

Cobalah online!

vy²*O})     # Vectorized product-sum.
       ²³*  # Vector * scalar.
          Q # Equivalence.
Guci Gurita Ajaib
sumber
1

R, 30 25 byte

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

Fungsi anonim, cukup mudah. Pengembalian TRUEatau FALSE.

rturnbull
sumber
0

OK, 12 byte

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

Ini adalah fungsi yang dibutuhkan [matrix;vector;scalar] .

Ini tidak berfungsi dalam k karena alasan yang sama yang 3.0~3memberi 0sebagai hasilnya.


Berikut ini berfungsi dalam k , dengan 14 byte :

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

Aksioma, 27 byte

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

latihan

(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
sumber
Saya belum pernah melihat bahasa ini sebelumnya, jawaban yang bagus! Apa yang @Booleandilakukan?
HyperNeutrino
(a = b) @Boolean akan berarti "pilih di antara operator yang diizinkan = (type1, type2) yang hasilnya adalah Boolean"; dalam beberapa kata "a = b" haruslah Boolean
RosLuP
0

Python, 26 byte

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

adan barray numpy,c adalah bilangan bulat.

Cobalah online!

Rɪᴋᴇʀ
sumber
2
Apakah orangtua di sekitar c*bbenar - benar diperlukan?
xnor
@ Terima kasih, sudah diperbaiki.
Rɪᴋᴇʀ
Ini hanya berfungsi untuk array kecil, karena NumPy menghapus representasi string array yang besar.
user2357112 mendukung Monica
contoh @ user2357112? Saya tidak yakin apa yang Anda maksud.
Rɪᴋᴇʀ
Jika c*bmemiliki lebih dari 1000 elemen, NumPy akan mengganti sebagian besar elemen dengan .... Demo.
user2357112 mendukung Monica
0

Clojure, 60 byte

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

Ini memeriksa bahwa semua delta adalah nol, sehingga runtuh ke dalam set nol. Contoh panggilan:

(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
sumber