고유 쌍 확인


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


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

0

파이썬, 26 바이트

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

a 과 b 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.