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



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

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


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.


"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

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.


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.


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!


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

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


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

R, 30 25 byte

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

Fungsi anonim, cukup mudah. Pengembalian TRUEatau FALSE.


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}

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

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!


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.