Özdeğer çiftlerini doğrulayın


21

Bu mücadelede size kare bir matris A, bir vektör vve bir skaler verilecek λ. Size (λ, v)karşılık gelen bir özdeğer olup olmadığını belirlemeniz gerekecektir A; yani olsun ya da olmasın Av = λv.

Nokta ürün

İki vektörün nokta çarpımı, eleman bazında çarpımın toplamıdır. Örneğin, aşağıdaki iki vektörün nokta ürünü:

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

Nokta ürünün sadece aynı uzunluktaki iki vektör arasında tanımlandığını unutmayın.

Matris-Vektör Çarpımı

Bir matris, 2B değerlerin ızgarasıdır. Bir mx nmatrisinde msatırlar ve nsütunlar vardır. Bir mx nmatrisini muzunluk vektörleri olarak düşünebiliriz n(satırları alırsak).

Matris-Vektör çarpımı, bir mx nmatris ve bir boyut- nvektör arasında tanımlanır . Eğer bir mx nmatrisini ve bir bedeni çarparsak-n vektörünü vektörünü elde ederiz m. iSonuç vektöründe inci değeri nokta ürünü olan imatrisin inci satır ve orijinal vektör.

Örnek

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

        1
        3
Let v = 5
        7
        9

Eğer matrisi ve vektörü çarparsak Av = x, şunları elde ederiz:

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 x 1 + 6 * 3 + 7 * 5 + 8 * 7 + 9 * 9 = 5 + 18 + 35 + 56 + 81 = 195

Öyleyse aldık Av = x = (95, 145, 195) .

Skaler çarpım

Bir skaler (bir sayı) ve bir vektörün çarpımı, basitçe eleman şeklinde çarpımdır. Örneğin,3 * (1, 2, 3) = (3, 6, 9) ,. Oldukça basittir.

Özdeğerler ve özvektörler

Matris göz önüne alındığında A, biz söylemek λkarşılık gelen bir özdeğeridir vve vkarşılık gelen bir özvektördür λ ancak ve ancak Av = λv . ( AvMatris-vektör çarpımı ve λvskalar çarpımı).

(λ, v) bir özpairdir.

Zorluk Özellikleri

Giriş

Girdi bir matris, bir vektör ve bir skalerden oluşacaktır. Bunlar herhangi bir makul formatta herhangi bir sırayla alınabilir.

Çıktı

Çıktı bir truthy / falsy değeri olacaktır; ve eğer sadece skalar ve vektör belirtilen matriks ile bir özdeğer ise, truthy.

kurallar

  • Standart boşluklar uygulanır
  • Kendi dilinizde bir özdeş çiftini doğrulamak için yerleşik bir dil varsa, onu kullanamazsınız.
  • Tüm sayıların tam sayı olduğunu varsayabilirsin.

Test Kılıfları

 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

Sonra bir 4x4 ekleyeceğim.

Test için daha kolay olan Okunamayan Test Durumları



@MartinEnder Teşekkürler. Başlangıçta, her bir benzersiz alan için bir temel hesaplamanız gereken, ancak sanal alandaki çok karışık bir görünüm olduğu için, keyfi boyutta matrisler için de benzer bir zorluk yaşadım.
HyperNeutrino,

Girişlerin 3x3'ten başka boyutları olabilirse, test durumlarınızdakilerin bir kısmını kapsamalısınız.
Martin Ender

1
@HyperNeutrino evet bu yardımcı olmuyor ... Bana açıklamaya çalışmayın: GCSE için matematik okuyor, bu yüzden sadece üzerimde kayboldu.
caird coinheringaahing

1
@ user00001 Yardıma ihtiyacınız olursa, eigenpair-aphrase sizin için. : P
mbomb007

Yanıtlar:


11

Jöle , 5 bayt

æ.⁵⁼×

Bu üçlü, tam bir programdır.

Çevrimiçi deneyin!

Nasıl çalışır

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

> _> bu çok kısa: P Güzel cevap
HyperNeutrino

6
Bu çılgın konuşma! : P
Dennis,

Bir şeyler yazıyorsun ve "hiçbir şeyin daha kısa olamayacağını" düşünüyorsun. Sonra MATL gelir ve kod boyutunuzu yarıya indirir. Sonra Jelly gelir ve yarıya indirir> _>
HyperNeutrino

@HyperNeutrino Elmaları portakallarla karşılaştırmayın. Golf dilleri, işlem başına bir bayt kadar azdır; normal diller nadiren vardır. Spesifikasyonun üç işlemi vardır (iki çarpma ve eşitlik) ve bir tane çoğaltmak için fazladan bir bayta izin verilmesi v, dört bayt kadar az bir bekleyiş bekleyebilir.
Sanchises,

2
Hem Jelly hem de MATL'nin matris çarpımı için iki byte kullanmasını seviyorum, bu cevabı gerçekten Jelly'in girdi almanın ne kadar iyi olduğunu, diğerlerinin de eşit olduğunu gösterir.
Sanchises,

13

Mathematica, 10 bayt

#2.#==#3#&

Gibi girdi alır {vector, matrix, scalar}ve bir boolean döndürür.


1
> _> Mathematica için bu çok kolaydı. +1: P
HyperNeutrino

9
@HyperNeutrino Ve şimdi biz MATL bekliyoruz ...
Martin Ender

2
Peki MATL göründü> _>
HyperNeutrino

1
Hiçbir şeyin daha kısa olamayacağını düşündüğünüz anlardan biri ve MATL aniden ortaya çıkıyor :)
Bay

@ Mr.Xcoder Ve sonra Jelly belirir.
Steadybox

11

MATL, 7 bayt

*i2GY*=

Sırayla Girişler: l, v,A .

Açıklama:

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

Şaşırtıcı derecede uzun cevap, bana sorarsanız, çoğunlukla tüm girişi doğru bir şekilde almam için bir yola ihtiyacım vardı. 5 bayttan daha azının mümkün olduğunu sanmıyorum, ancak birinin 5 veya 6 baytlık bir çözüm bulması iyi olurdu.

Temel olarak, bu hesaplar l*v==A*v.


P: "Şaşırtıcı uzun" Ben> _> güzel cevap olsa en az 20 bayt bekliyordum
HyperNeutrino

2
Eh, MATLAB cevabının 16 baytta geleceğini düşünürsek @(A,v,l)A*v==v*l, bu oldukça ayrıntılı görünüyor ve girdiyi biraz daha akıllıca elde edersem 6'nın bol olması gerektiğini hissediyorum.
Sanchises,

Görünüşe göre 38 baytta geldi ama golf oynayabileceğinden eminim.
HyperNeutrino,

3
@HyperNeutrino Önceki yorumu doğrulamak için kendim ekledim. (ya da truthy ...?)
Sanchises

6

CJam , 15 bayt

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

Formdaki girişi alır vector scalar matrix.

Çevrimiçi deneyin!

açıklama

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 bayt

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

Oldukça önemsiz cevap. Girdileri alan adsız bir işlevi tanımlar ve elde edilen vektörlerin element-temelli eşitliğini hesaplar. Mantıksal bir dizideki tek bir sıfır, MATLAB'de bir diziyi yanlış yapar.


Örneğin [true,false], bana öğrettiğin için teşekkürler sahtekarlığının farkında değildim =)
kusur 15

1
@flawr Bu cevabı Suever (ayrıca MATLAB için de geçerlidir) 'e bakın. Temel olarak, hemen hemen-büt-değil oldukça (boş matris []örtülü farklıdır) all()girişine denir if, whilevb
Sanchises

2

MATLAB, 38 bayt

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

1 veya 0 döndürür.

MATLAB, 30 bayt

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

İade

1
1
1

gerçek bir değer olarak. Bir sahte değer, 1 yerine 0 değerinden herhangi biri veya tümü ile benzer bir vektördür.


MATLAB'ı bilmiyorum ama isequalfonksiyon kısaltılabilir ==mi?
HyperNeutrino,

1
@HyperNeutrino isequal, eğer çıktı gerekli ise trueveya falsebir truthy veya falsey değeri yerine gerekli olacaktı . Mücadele olduğu gibi ==, gerçekten yeterli.
Sanchises,

@HyperNeutrino İki vektörün elementel olarak karşılaştırmasının sonuçlarını içeren bir vektör döndürür.
Steadybox

Tamam. Yine de güzel cevap!
HyperNeutrino

isimsiz bir fonksiyon daha kısa olmaz mıydı?
Batman

2

C ++, 225 203 bayt

22 byte'ı kurtardığı için @Cort Ammon ve @Julian Wolf'a teşekkürler!

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

Çevrimiçi deneyin!


1
using std::vector;Bundan iki bayt golf oynayabilir. Bu 18 byte, ancak 4 std::s kaldırabilirsiniz , 20 tasarruf - 20
Am

2
daha iyi, using V=std::vector<float>;ya da benzer
Julian Wolf


2

Python 2.7, 33 bayt

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

giriş: m = matris, s = skalar, e = özdeğer. M ve s sıradan dizilerdir


2
Bu iyi görünüyor, ancak import npgeçerli olması için bayt sayısını eklemeniz gerektiğini düşünüyorum
DJMcMayhem

1
Bir önceki print(m,s,e)deyimi değişkenleri nedeniyle çalıştı olmazdı m, sve ehenüz tahsis edilmemiştir / tanımladı. Ayrıca, iki noktadan sonra boşluğu kaldırabilirsiniz. Ayrıca `as n` kısmını kaldırabilir ve numpydaha sonra kullanabilirsiniz ; yalnızca bir kez kullandığınızdan, tam adı kullanmak aslında bir bayt kazandırır.
HyperNeutrino

1
Tamam şimdi anladım. Önerileriniz için teşekkürler, her
parçayı

2
Bunun allyerine olmamalı mıydı any? Ve sanırım svektör, skaler değil, bir şey kaçırmadığım sürece
Luis Mendo

1
Dize gösterimlerini karşılaştırmak daha da kısa olacaktır. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Dennis



1

R, 30 25 bayt

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

Anonim işlev, oldukça basit. TRUEVeya döndürür FALSE.


0

tamam, 12 bayt

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

Bu bir işlevdir, içine alır [matrix;vector;scalar].

Bu, sonuç olarak 3.0~3veren aynı nedenlerle k'da çalışmaz 0.


Aşağıdakiler 14 bayt ile k olarak çalışır :

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

0

Aksiyom, 27 bayt

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

egzersizleri

(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

Bu dili daha önce görmedim, güzel cevap! Ne yapar @Boolean?
HyperNeutrino

(a = b) @Boolean, "sonucunu Boolean olan = izin verilen operatör = (tip1, tip2) arasından seçim yapın"; Birkaç kelimeyle "a = b" Boolean olmalı
RosLuP

0

Python, 26 bayt

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

ave bnumpy dizileri, cbir tamsayıdır.

Çevrimiçi deneyin!


2
Etraftaki parenler c*bgerçekten gerekli mi?
xnor

@ xnor teşekkürler, düzeltildi.
Rɪᴋᴇʀ

Bu sadece küçük diziler için işe yarar, çünkü NumPy geniş dizi dizgelerini temsil eder.
user2357112,

@ user2357112 örneği? Neyi kastettiğinden emin değilim.
Rɪᴋᴇʀ

Eğer c*b1000'den fazla öğesi vardır, NumPy ile elementlerin en yerini alacak .... Demo.
user2357112,

0

Clojure, 60 bayt

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

Bu, tüm deltaların sıfır olduğunu kontrol eder, böylece sıfır kümesine çöker. Çağrı örneği:

(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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.