ยืนยัน Eigenpairs


21

ในความท้าทายนี้คุณจะได้รับตารางเมทริกซ์A, เวกเตอร์และสเกลาv λคุณจะต้องตรวจสอบว่า(λ, v)เป็น eigenpair ที่สอดคล้องกับA; Av = λvที่เป็นหรือไม่

ผลิตภัณฑ์ Dot

ผลคูณดอทของสองเวกเตอร์คือผลรวมของการคูณองค์ประกอบที่ฉลาด ตัวอย่างเช่นผลิตภัณฑ์ดอทของเวกเตอร์สองตัวต่อไปนี้คือ:

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

โปรดทราบว่าผลิตภัณฑ์ดอตจะถูกกำหนดระหว่างเวกเตอร์สองตัวที่มีความยาวเท่ากันเท่านั้น

การคูณเมทริกซ์ - เวกเตอร์

เมทริกซ์คือตาราง 2 มิติของค่า 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เราบอกว่าλเป็นค่าเฉพาะที่สอดคล้องกับvและvเป็นวิคเตอร์ที่สอดคล้องกับถ้าหากλ Av = λv(การAvคูณเมทริกซ์ - เวกเตอร์อยู่ที่ไหนและการλvคูณสเกลาร์)

(λ, v) เป็นไอเก็นแพร์

ข้อมูลจำเพาะของความท้าทาย

อินพุต

ข้อมูลที่ป้อนประกอบด้วยเมทริกซ์เวกเตอร์และสเกลาร์ สิ่งเหล่านี้สามารถดำเนินการในลำดับใด ๆ ในรูปแบบที่เหมาะสม

เอาท์พุต

การส่งออกจะเป็นค่าความจริง / เท็จ; ความจริงก็ต่อเมื่อเซนต์คิตส์และเนวิสเป็น eigenpair และเมทริกซ์ที่ระบุ

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • หากมีในตัวสำหรับตรวจสอบ eigenpair อยู่ในภาษาของคุณคุณไม่สามารถใช้งานได้
  • คุณอาจคิดว่าตัวเลขทั้งหมดเป็นจำนวนเต็ม

กรณีทดสอบ

 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 คุณควรครอบคลุมบางส่วนในกรณีทดสอบของคุณ
Martin Ender

1
@HyperNeutrino ใช่ที่ไม่ได้ช่วย ... อย่าพยายามอธิบายให้ฉัน: ฉันอยู่โรงเรียนมัธยมที่เรียนคณิตศาสตร์สำหรับ GCSE ดังนั้นมันก็แพ้ฉัน
caird coinheringaahing

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
Dennis

คุณเขียนอะไรสักอย่างแล้วคิดว่า "ไม่มีอะไรจะสั้นไปกว่านี้!" จากนั้น MATL จะเข้ามาและลดขนาดรหัสลงครึ่งหนึ่ง จากนั้นเจลลี่ก็จะมาพร้อมกันและแบ่งออกเป็นครึ่งหนึ่งว่า> _>
HyperNeutrino

@HyperNeutrino อย่าเปรียบเทียบแอปเปิ้ลกับส้ม ภาษาการเล่นกอล์ฟมีขนาดเล็กเพียงหนึ่งไบต์ต่อการใช้งานบางสิ่งที่ภาษาปกติไม่ค่อยมี ข้อมูลจำเพาะมีสามการดำเนินการ (การคูณสองรายการและความเท่าเทียมกัน) และการอนุญาตให้ใช้ไบต์พิเศษเพื่อทำซ้ำvอาจคาดหวังเพียงสี่ไบต์
Sanchises

2
ฉันชอบวิธีที่ทั้งเยลลี่และ MATL ใช้สองไบต์สำหรับการคูณเมทริกซ์ซึ่งหมายความว่าคำตอบนี้แสดงให้เห็นว่าจริง ๆ แล้วเยลลี่ที่ดีกำลังรับอินพุตอยู่
Sanchises

13

Mathematica ขนาด 10 ไบต์

#2.#==#3#&

รับอินพุตเหมือน{vector, matrix, scalar}และส่งคืนบูลีน


1
> _> นี่มันง่ายเกินไปสำหรับ Mathematica +1: P
HyperNeutrino

9
@HyperNeutrino และตอนนี้เรากำลังรอ MATL ...
Martin Ender

2
MATL ปรากฏตัวแล้ว> _>
HyperNeutrino

1
หนึ่งในช่วงเวลาเหล่านั้นเมื่อคุณคิดว่าไม่มีอะไรที่จะสั้นลงและ MATL ก็โผล่ขึ้นมาทันที :)
Mr. Xcoder

@ Mr.Xcoder จากนั้น Jelly ก็ปรากฏตัวขึ้น
Steadybox

11

MATL, 7 ไบต์

*i2GY*=

lปัจจัยการผลิตในการสั่งซื้อ: v, A,

คำอธิบาย:

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


ไม่ได้ตระหนักถึง falseyness ของเช่น[true,false]ขอบคุณสำหรับการเรียนการสอนให้ฉัน =)
flawr

1
@flawr ดูคำตอบนี้โดย Suever (ซึ่งใช้ได้กับ MATLAB) โดยทั่วไปเกือบ แต่ไม่ค่อนข้าง (เมทริกซ์ที่ว่างเปล่า[]ที่แตกต่างกัน) โดยปริยายall()เรียกว่าการป้อนข้อมูลของif, whileฯลฯ
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

เป็นค่าความจริง ค่าที่ไม่แน่นอนคือเวกเตอร์ที่คล้ายกันที่มีค่าใด ๆ หรือทั้งหมด 0 แทน 1


ฉันไม่รู้ MATLAB แต่isequalฟังก์ชั่นสามารถย่อให้สั้นลงได้==ไหม
HyperNeutrino

1
@HyperNeutrino isequalจะต้องถ้าเอาท์พุทที่ต้องการtrueหรือfalseมากกว่าค่าความจริงหรือเท็จ ในฐานะที่เป็นสิ่งที่ท้าทาย==ก็เพียงพอแล้ว
Sanchises

@HyperNeutrino มันจะคืนค่าเวกเตอร์ที่มีผลลัพธ์ของการเปรียบเทียบแบบตามองค์ประกอบของเวกเตอร์สองตัว
Steadybox

ตกลง. คำตอบที่ดีแม้ว่า!
HyperNeutrino

ฟังก์ชันที่ไม่ระบุชื่อจะสั้นลงไหม
แบทแมน

2

C ++, 225 203 ไบต์

ขอบคุณ @Cort Ammon และ @Julian Wolf สำหรับการบันทึก 22 ไบต์!

#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;สามารถตีสองไบต์ได้ มีค่าใช้จ่าย 18 ไบต์ แต่สามารถลบได้ 4 std::วิประหยัด 20.
Cort Ammon - Reinstate Monica

2
ดีขึ้นusing V=std::vector<float>;หรือคล้ายกัน
Julian Wolf


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)คำสั่งจะไม่ได้ทำงานเพราะตัวแปรm, sและeยังไม่ได้รับมอบหมาย / กำหนด นอกจากนี้คุณสามารถลบช่องว่างหลังเครื่องหมายจุดคู่ นอกจากนี้คุณสามารถลบส่วน `เป็น n 'และใช้ในnumpyภายหลัง เนื่องจากคุณใช้เพียงครั้งเดียวการใช้ชื่อจริงจะบันทึกไบต์
HyperNeutrino

1
โอเคฉันเข้าใจแล้ว. ขอบคุณสำหรับคำแนะนำบีบทุกบิต :)
HonzaB

2
ไม่ควรที่จะเป็นallแทนany? และฉันคิดว่าsเป็นเวกเตอร์ไม่ใช่สเกลาร์เว้นแต่ว่าฉันจะพลาดบางสิ่งบางอย่าง
หลุยส์เมนโด

1
มันจะยิ่งสั้นลงเพื่อเปรียบเทียบการแทนสตริง tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/ …
เดนนิส

2

Python 3 , 96 70 ไบต์

ไม่มี builtins สำหรับการคูณเมทริกซ์เวกเตอร์หรือสเกลาร์เวกเตอร์!

lambda A,L,v:all(L*y==sum(i*j for i,j in zip(x,v))for x,y in zip(A,v))

ลองออนไลน์!

-26 ไบต์โดยใช้zipขอบคุณ @LeakyNun!




1

R, 30 25 ไบต์

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

ฟังก์ชั่นนิรนามตรงไปตรงมาค่อนข้าง ผลตอบแทนหรือTRUEFALSE


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ทำอย่างไร
HyperNeutrino

(a = b) @Boolean จะหมายถึง "เลือกระหว่างตัวดำเนินการ = ที่อนุญาต (type1, type2) ผลลัพธ์ที่ได้คือ Boolean"; ในคำไม่กี่คำ "a = b" จะต้องมีบูลีน
RosLuP

0

Python ขนาด 26 ไบต์

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

aและbเป็นอาร์เรย์ numpy cเป็นจำนวนเต็ม

ลองออนไลน์!


2
parens รอบc*bๆ จำเป็นจริง ๆ ?
xnor

@xnor ขอบคุณคง
Rɪᴋᴇʀ

ใช้งานได้กับอาร์เรย์ขนาดเล็กเท่านั้นเนื่องจาก NumPy ยกเลิกการแสดงสตริงอาร์เรย์ขนาดใหญ่
user2357112 รองรับ Monica

ตัวอย่าง @ user2357112 ฉันไม่แน่ใจว่าคุณหมายถึงอะไร
Rɪᴋᴇʀ

หากc*bมีมากกว่า 1000 องค์ประกอบ NumPy ...จะเข้ามาแทนที่ส่วนใหญ่ขององค์ประกอบที่มี การสาธิต.
user2357112 รองรับ Monica

0

Clojure 60 ไบต์

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

ตรวจสอบว่า delta ทั้งหมดเป็นศูนย์ดังนั้นการยุบลงในชุดของศูนย์ ตัวอย่างการโทร:

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