고유 쌍 확인


21

이 도전에서는 정사각 행렬 A, 벡터 v및 스칼라가 제공 λ됩니다. 에 (λ, v)해당하는 고유 쌍 인지 확인해야 합니다 A. 즉, 여부 Av = λv입니다.

도트 제품

두 벡터의 내적은 요소 별 곱셈의 합입니다. 예를 들어 다음 두 벡터의 내적은 다음과 같습니다.

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

내적은 길이가 같은 두 벡터 사이에서만 정의됩니다.

행렬 벡터 곱셈

행렬은 값의 2D 격자입니다. mX의 n행렬 갖는 m행과 n열. mx n행렬 m을 길이의 벡터 로 상상할 수 있습니다 n(행을 취하는 경우).

행렬-벡터 곱셈은 mx n행렬과 크기- n벡터 사이에 정의됩니다 . mx n행렬과 크기 n벡터를 곱하면 크기 벡터를 얻습니다 m. i결과 벡터 의- 번째 값 i은 행렬 의- 번째 행과 원래 벡터 의 내적 입니다.

        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 = AT 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이고 if와 if에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 이외의 다른 치수를 가질 수있는 경우 테스트 사례에서 일부를 포함해야합니다.
Martin Ender

1
@HyperNeutrino 그렇습니다. 도움이되지 않습니다 ... 저에게 설명하지 마십시오 : 저는 고등학교에서 GCSE 수학을 공부하고 있기 때문에 저를 잃어 버렸습니다.
caird coinheringaahing

1
@ user00001 도움이 필요하면 eigenpair -aphrase 를 사용하십시오. : P
mbomb007

답변:


11

젤리 , 5 바이트

æ.⁵⁼×

이 프로그램은 3 자 전체 프로그램입니다.

온라인으로 사용해보십시오!

작동 원리

æ.⁵⁼×  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 사과를 오렌지와 비교하지 마십시오. 골프 언어는 작업 당 1 바이트 정도의 작은 크기를 가지므로 일반 언어는 거의 사용하지 않습니다. 스펙에는 세 가지 연산 (두 번의 곱셈과 등식)이 있으며 여분의 바이트가 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을 기다립니다 ...
Martin Ender

2
잘 MATL이 나타납니다> _>
HyperNeutrino

1
아무것도 짧을 수 없다고 생각하고 MATL이 갑자기
나타나는

@ 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

오히려 사소한 대답. 입력을받는 익명 함수를 정의하고 결과 벡터의 요소 별 동등성을 계산합니다. 논리 배열에서 단일 0은 MATLAB에서 배열을 잘못된 것으로 만듭니다.


예를 들어 [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

진실한 가치로. 허위 값은 1 대신에 0 또는 0 값을 가진 유사한 벡터입니다.


MATLAB을 모르지만 isequal기능을 단축 할 수 ==있습니까?
HyperNeutrino

1
isequal출력이 필요 true하거나 false진실 또는 거짓 값이 아닌 경우 @HyperNeutrino 가 필요 합니다. 도전이 의미하는 것처럼, ==충분하다.
Sanchises

@HyperNeutrino 두 벡터의 요소 별 비교 결과를 포함하는 벡터를 반환합니다.
Steadybox

오 알았어 그래도 좋은 답변입니다!
HyperNeutrino

익명 함수가 더 짧지 않습니까?
배트맨

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 Ammon-Reinstate Monica

2
더 나은, using V=std::vector<float>;또는 유사한
Julian Wolf


2

파이썬 2.7, 33 바이트

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

입력 : m = 행렬, s = 스칼라, e = 고유 값. M과 s는 numpy 배열입니다


2
이것은 좋아 보이지만, import np유효한 바이트 수를 포함시켜야한다고 생각 합니다.
DJMcMayhem

1
이전 print(m,s,e)문은 변수가 있기 때문에 일을하지 않았을 m, s그리고 e아직 할당되지 않은 / 정의했다. 또한 콜론 뒤에 공백을 제거 할 수 있습니다. 또한`as n` 부분을 제거하고 numpy나중에 사용할 수 있습니다 . 한 번만 사용하므로 전체 이름을 사용하면 실제로 바이트가 저장됩니다.
HyperNeutrino

1
알았어 이제 이해 했어. 모든 비트를 짜내는 제안에 감사드립니다 :)
HonzaB

2
all대신 해서는 안 any됩니까? 그리고 내가 s뭔가
빠지지

1
문자열 표현을 비교하는 것이 훨씬 짧습니다. tio.run/nexus/python2#jZDPCoMwDIfP@hQ9tiOV/hEHgk/…
Dennis



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결과로.


다음은 k14 바이트 에서 작동 합니다 .

{(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은 "허용 된 = operator (type1, type2) 중에서 결과가 부울 인 것을 선택합니다"를 의미합니다. 몇 마디로 "a = b"는 부울
이어야합니다

0

파이썬, 26 바이트

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

ab NumPy와 배열이며, c정수입니다.

온라인으로 사용해보십시오!


2
주변의 파렌이 c*b실제로 필요합니까?
xnor

@ xnor 감사합니다.
Rɪᴋᴇʀ

NumPy는 큰 배열 문자열 표현을 요약하기 때문에 작은 배열에만 작동합니다.
user2357112는 Monica

@ user2357112 예? 무슨 말인지 잘 모르겠습니다.
Rɪᴋᴇʀ

경우 c*b1000 개 이상의 요소를 가지고, NumPy와 함께 대부분의 요소를 대체합니다 .... 데모.
user2357112는 Monica

0

클로저, 60 바이트

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

모든 델타가 0인지 확인하여 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.