固有ペアの検証


21

この課題では、正方行列A、ベクトルv、およびスカラーが与えられますλ。に(λ, v)対応する固有ペアかどうかを判断する必要がありAます。つまり、かどうかAv = λv

ドット積

2つのベクトルのドット積は、要素ごとの乗算の合計です。たとえば、次の2つのベクトルの内積は次のとおりです。

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

内積は、同じ長さの2つのベクトル間でのみ定義されることに注意してください。

行列ベクトル乗算

マトリックスは、値の2Dグリッドです。mXのn行列がありm、行とn列を。(行を取得する場合)mx n行列mを長さのベクトルとして想像できnます。

行列とベクトルの乗算は、mx n行列とサイズnベクトルの間で定義されます。mx n行列とサイズnベクトルを乗算すると、サイズベクトルが得られmます。i結果ベクトルの-th値iは、行列の-th行と元のベクトルのドット積です。

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

        1
        3
Let v = 5
        7
        9

行列とベクトルを乗算するとAv = x、次のようになります。

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

だから、取得しAv = x = (95, 145, 195)ます。

スカラー乗算

スカラー(単一の数値)とベクトルの乗算は、単純に要素ごとの乗算です。たとえば、3 * (1, 2, 3) = (3, 6, 9)。それはかなり簡単です。

固有値と固有ベクトル

行列が与えられた場合A、それλはに対応する固有値であり、ifのみに対応する固有ベクトルであるvと言います。(ここで、行列ベクトル乗算とスカラー乗算があります)。vλ Av = λvAvλv

(λ, v) 固有対です。

チャレンジ仕様

入力

入力は、行列、ベクトル、およびスカラーで構成されます。これらは、任意の合理的な形式で任意の順序で取得できます。

出力

出力は真実/偽の値になります。スカラーとベクトルが指定された行列を持つ固有ペアである場合にのみ、真実です。

ルール

  • 標準的な抜け穴が適用されます
  • 固有ペアを検証するためのビルトインがあなたの言語に存在する場合、それを使用することはできません。
  • あなたはすべての数字が整数であると仮定することができます

テストケース

 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

後で4x4を追加します。

テストが簡単な判読不能なテストケース



@MartinEnderありがとう。私はもともと、任意のサイズの行列に対して同様の課題を抱えていました。そこでは、一意の各固有空間の基底を計算するつもりでしたが、それはあまりにも混乱しているように見えるため、サンドボックスにあります。
-HyperNeutrino

入力が3x3以外の次元を持つ場合、テストケースでその一部をカバーする必要があります。
マーティンエンダー

1
@HyperNeutrinoええ、それは助けになりません...それを私に説明しようとしないでください:私は高校でGCSEの数学を勉強しているので、ちょうど私に負けました。
ケアイン共和

1
@ user00001ヘルプが必要な場合は、eigenpair-aphraseしてください。:P
mbomb007

回答:


11

ゼリー、5バイト

æ.⁵⁼×

これはトライアド、フルプログラムです。

オンラインでお試しください!

使い方

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

> _>これは短すぎます:Pいい答え
-HyperNeutrino

6
それはクレイジーな話です!:P
デニス

何かを書いて、「これ以上短くなることはできない」と考えます。次にMATLが登場し、コードサイズが半分になります。その後、ゼリーが登場し、半分になります> _>
HyperNeutrino

@HyperNeutrinoリンゴとオレンジを比較しないでください。ゴルフ言語には、操作ごとに1バイトしかありませんが、通常の言語ではめったにありません。仕様には3つの操作(2つの乗算と等式)があり、v1 バイトを複製するために余分なバイトを許可すると、わずか4バイトしか期待できません。
-Sanchises

2
私は、JellyとMATLの両方が行列乗算に2バイトを使用する方法が好きです。つまり、この答えは、Jellyが入力を取得するのにどれだけ優れているかを示しています。
-Sanchises

13

Mathematica、10バイト

#2.#==#3#&

のような入力を受け取り{vector, matrix, scalar}、ブール値を返します。


1
> _>これはMathematicaにとって簡単すぎました。+1:P
HyperNeutrino

9
@HyperNeutrinoそして今、我々は... MATL待つ
マーティン・エンダー

2
まあMATLが登場しました> _>
HyperNeutrino

1
何も短くなるとは思わず、MATLが突然ポップアップする瞬間の1つです。)
Xcoder氏17

@ Mr.Xcoderそして、ゼリーが現れます。
Steadybox

11

MATL、7バイト

*i2GY*=

順番に入力:lvA

説明:

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

主に私がすべての入力を正しく取得する方法が必要だったので、私に尋ねると、驚くほど長い答えです。5バイト未満が可能であるとは思いませんが、誰かが5バイトまたは6バイトのソリューションを見つけたら、それはすばらしいでしょう。

基本的に、これはを計算しl*v==A*vます。


「驚くほど長い」私は少なくとも20バイトを期待していました> _>良い答え:P
HyperNeutrino

2
さて、MATLABの答えが16バイト@(A,v,l)A*v==v*lで入ることを考えると、これは非常に冗長に思え、入力をいくぶん賢くすれば6で十分だと思います。
-Sanchises

どうやらそれは38バイトで来たようですが、それはゴルフでダウンできると確信しています。
-HyperNeutrino

3
@HyperNeutrino独自のコメントを追加して、前のコメントを真にしました。(または真実...?)
Sanchises

6

CJam、15バイト

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

フォームの入力を受け取りますvector scalar matrix

オンラインでお試しください!

説明

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バイト

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

むしろ些細な答え。入力を受け取る匿名関数を定義し、結果のベクトルの要素ごとの等式を計算します。論理配列の単一のゼロは、MATLABで配列を偽にします。


たとえば[true,false]、私に教えてくれてありがとうの偽りを知らなかった=)
flawr

1
@flawr Suever によるこの回答を参照してください(MATLABにも適用可能)。基本的に、ほぼ空で[]はない(空のマトリックスは異なります)暗黙的なall()入力はifwhileなどの入力で呼び出されます
。– Sanchises

2

MATLAB、38バイト

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

1または0を返します。

MATLAB、30バイト

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

返品

1
1
1

真実の価値として。偽の値は、1ではなく0のいずれかまたはすべての値を持つ同様のベクトルです。


私はMATLABを知りませんが、isequal関数を短縮でき==ますか?
-HyperNeutrino

1
@HyperNeutrinoはisequal出力が必要な場合に必要とされるtruefalseではなく、truthyまたはfalsey値。課題が立っているので、それで==十分です。
-Sanchises

@HyperNeutrino 2つのベクトルの要素ごとの比較の結果を含むベクトルを返します。
Steadybox

いいよ いい答えだ!
ハイパーニュートリノ

無名関数は短くなりませんか?
バットマン

2

C ++、225203バイト

22バイトを節約してくれた@Cort Ammonと@Julian Wolfに感謝します!

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

オンラインでお試しください!


1
using std::vector;これから2バイトゴルフすることができます。これは、18のバイトがかかりますが、4削除することができますstd::秒、20を保存する
復活モニカ- Cortのアモン

2
より良い、using V=std::vector<float>;または同様の
ジュリアンウルフ


2

Python 2.7、33バイト

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

入力:m = matrix、s = scalar、e = eigenvalue。Mとsはnumpy配列です


2
これは良いに見えますが、私はあなたがのバイト数含める必要があると思うimport np、それが有効であるために
DJMcMayhem

1
あなたの前のprint(m,s,e)ステートメントは、変数ために働いていないだろうmsと、eまだ割り当てられていなかった/定義されます。また、コロンの後のスペースを削除できます。また、 `as n`部分を削除して、numpy後で使用することもできます。一度しか使用しないため、フルネームを使用すると実際にバイトが節約されます。
ハイパーニュートリノ

1
はい、分かりました。提案をありがとう、すべてのビットを絞る:)
HonzaB

2
all代わりにすべきではありませんanyか?そしてs、私は何かを逃していない限り、スカラーではなくベクトルだと思う
ルイスメンドー

1
文字列表現を比較するとさらに短くなります。tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…–
デニス



1

R、30 25バイト

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

匿名関数、かなり簡単です。TRUEまたはを返しますFALSE


0

OK、12バイト

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

これは関数であり、を取ります[matrix;vector;scalar]

これは、同じ理由でKでは動作しません3.0~3与え0、結果として。


以下はkで動作し、14バイトです:

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

0

公理、27バイト

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

演習

(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

この言語を見たことがありません、いい答えです!何をし@Booleanますか?
ハイパーニュートリノ

(a = b)@Booleanは、「許可された= operator(type1、type2)の中から結果がブールであるものを選択する」ことを意味します。いくつかの言葉で「a = b」はブール値でなければなりません
-RosLuP

0

Python、26バイト

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

aそしてbnumpyのアレイであり、c整数です。

オンラインでお試しください!


2
周りの括弧はc*b実際に必要ですか?
-xnor

@xnorありがとう、修正。
Rɪᴋᴇʀ

NumPyは大きな配列文字列表現を短縮するため、これは小さな配列でのみ機能します。
user2357112は

@ user2357112の例?どういう意味かわかりません。
Rɪᴋᴇʀ

c*b1000個を超える要素がある場合、NumPyはほとんどの要素をで置き換え...ます。デモ。
user2357112は

0

Clojure、60バイト

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

これにより、すべてのデルタがゼロであることが確認され、ゼロのセットに折りたたまれます。呼び出し例:

(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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.