매트릭스가 양의 한정인가?


19

소개

오늘 우리는 1 학년 선형 대수학 학생들의 골칫거리를 다룰 것입니다 : 행렬의 명확성! 분명히 이것은 아직 도전이 없으므로 여기에갑니다.

입력

  • 대칭 행렬 편리한 형식 (당신은 또한 물론에만 상단 또는 행렬의 하부 걸릴 수 있음)n×n AA
  • 선택적으로 : 행렬의 크기n

무엇을해야합니까?

문제는 간단합니다. 실수 형 행렬이 주어진 경우 행렬은 참 값을 출력하고 그렇지 않으면 거짓 값을 출력하여 양의 정한지를 결정합니다.n×n

기본 제공 기능이 실제로 정확하게 작동한다고 가정 할 수 있으므로 전략 / 코드가 "아마도"올바른 결과를 제공 할 경우 잘못된 동작으로 이어질 수있는 숫자 문제를 고려하지 않아도됩니다.

누가 이겼어?

이것은 이므로 바이트 단위 (언어 당) 가장 짧은 코드가 승리합니다!


어쨌든 양의 명확한 매트릭스는 무엇입니까?

대칭 매트릭스가 양의 한정 인 경우의 6 개의 등가의 공식이 존재한다. 더 쉬운 세 가지를 재현 하고 더 복잡한 것을 Wikipedia 로 안내합니다.

  • 만약 후 포지티브 한정된다. 이것은 0이 아닌 모든 벡터 대해 와 의 (표준) 내적 이 양수인 경우 는 양의 한정입니다.vRn{0}:vTAv>0A

    vvAvA
  • 하자 될 고유 의 지금 경우 (즉, 모든 인 고유 값은 양수 임) 는 양수입니다. 고유 값이 무엇인지 모르는 경우 설명 (및 필요한 계산 전략)이이 게시물에 포함하기에 너무 길기 때문에 즐겨 찾는 검색 엔진을 사용하여 알아내는 것이 좋습니다.λii{1,,n}A i { 1 , , n } : λ i > 0 AAi{1,,n}:λi>0A
  • 경우] 촐레 - 분해 의 존재하며, 즉 더 낮은 삼각 행렬이 존재 되도록 다음 포지티브 확정적이다. 이는 부정적 인수로 인해 알고리즘 중 루트 계산이 실패하는 경우 조기 리턴 "false"와 같습니다.ALLLT=AA

진실한 결과물

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

잘못된 출력

(적어도 하나의 고유 값은 0 / 양의 반 )

(322240202)

(고유 값은 서로 다른 부호 / 무한정)

(100010001)

(0보다 작은 모든 고유 값 / 음수 한정)

(100010001)

(0보다 작은 모든 고유 값 / 음수 한정)

(230350001)

(0보다 작은 모든 고유 값 / 음수 한정)

(7.152.452.459.37)

(3 개의 양수, 1 개의 음수 고유 값 / 무한)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



수학 표기법을 모두 읽거나 "고유 값"이 무엇인지 모두 알고 있다고 가정하기보다는 찾고자하는 것에 대한 더 나은 정의를 제공해야합니다. 실제 예제도 유용 할 것입니다.
얽히고 설킨

9
@Shaggy 나는 도전을 막는 모든 배경없이 도전이 더 좋다고 생각합니다. 고유 값이 무엇인지에 대한 기존의 설명이 많이 있으며이 게시물은 이미 상당히 큽니다.
밀 마법사

1
입력을 대칭 행렬로 제한하지 않으면 문제가 더 좋을 것 입니다.
polfosol ఠ_ఠ

1
나는 고유 값의 부호를 확인하는 것이 지루하다는 것을 의미했습니다. 내가 아는 다른 맛;)
polfosol ఠ_ఠ

답변:


11

C, 108 바이트

Logern 덕분에 -1 바이트, ceilingcat 덕분에
-3 바이트

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

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

가우시안 제거를 수행하고 모든 대각선 요소가 양수인지 확인합니다 (실베스터의 기준). 인수 n는 행렬의 크기에서 1을 뺀 크기입니다.


아마도 double 대신 float로 문자를 저장합니까?
Jens


i=0for 루프 를 삭제 하고 재귀 호출 f(M,n-1,0)을하고 세 번째 인수로 0을 사용하여 초기 호출을 하면 다른 문자를 면도 할 수 있습니다 .
Jens

@Jens 1. double 대신 float를 사용하면 눈에 띄는 반올림 오류가 발생할 수 있으므로 저장된 1 바이트가 가치가 있다고 생각하지 않습니다. 2. 추가 인수를 통해 변수를 초기화하면 바람을 피우는 것처럼 보입니다.
nwellnhof

@Logern C 답변에 "반환 진술 생략"트릭을 사용하지 않습니다. 그러나 다른 바이트를 저장해 주셔서 감사합니다.
nwellnhof

9

MATLAB / 옥타브 , 19 17 12 바이트

@(A)eig(A)>0

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

eig 함수는 고유 값을 오름차순으로 제공하므로 첫 번째 고유 값이 0보다 크면 다른 고유 값도 있습니다.


f=처음 에는 을 삭제할 수 있습니다. 익명 함수는 일반적으로 답변으로 허용됩니다.
Delfad0r

팁 고마워!
Daniel Turizo

그것의 벡터라도? 흥미로운
Daniel Turizo

1
+1. 온라인에서 사용하기위한 링크를 추가했습니다. 당신이 상관하지 않기를 바랍니다. 또한 배열에도 불구하고 출력 값은 게시 된 링크 @ Delfad0r에 따라 올바른 "거짓"또는 "거짓"값으로 계산됨을 증명합니다.
톰 카펜터

2
그러나 TIO의 첫 번째 "거짓"테스트 사례에서는 실패했습니다. 정밀성 문제로 추측하고 있습니다.-고유 값 중 하나 8.9219e-17가 0이 아닌 0으로 나타납니다.
Tom Carpenter

7

젤리 , 11 10 바이트

ṖṖ€$ƬÆḊṂ>0

실베스터의 기준을 사용합니다 .

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

작동 원리

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

하스켈 , 56 바이트

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

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

기본적으로 nwellnhof의 답변 포트입니다 . 가우스 제거를 수행하고 주 대각선의 요소가 양수인지 확인합니다.

반올림 오류로 인해 첫 번째 잘못된 출력이 실패하지만 이론적으로는 무한 정밀도로 작동합니다. Curtis Bechtel의 제안 덕분에 이제 출력이 모두 정확합니다.


2
inputs :: [[[Rational]]]정답을 얻기 위해 추가 할 수 있습니다
Curtis Bechtel

4

네 번째 테스트 사례는 False 여야합니까?
tsh

@ tsh 고정, 나는 바보입니다!
Mr. Xcoder

8
Mathematica가 이것을 위해 내장 된 방법이 재미 있지만 그 이름이 솔루션보다 깁니다.
Federico Poloni

@FedericoPoloni : NullSpace 또는 MatrixRank를 사용하는 솔루션이 더 짧지 않습니까? Null 공간이 0이면 행렬은 양수입니다.
Phil H

@PhilH 아니오, 그 자체로는 효과가 없습니다. 예를 들어, 두 번째 잘못된 예 ((1, -1,1)이있는 대각 행렬)의 순위는 3이지만 양수는 아닙니다.
Federico Poloni




2

MATL , 6 바이트

더 적은 바이트 인 @Mr을 사용하여 수행 할 수 있습니다. Xcoder는 5 바이트 MATL 답변 을 찾았습니다 !

YvX<0>

설명

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

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


첫 번째 잘못된 테스트 사례에서 실패 합니다. 삭제 된 답변을 참조하십시오 .
Mr. Xcoder

1
@ Mr.Xcoder 오, 당신은 심지어 내 앞에 답변을 제출했습니다. 반올림 문제에 따라 답변을 삭제 취소해야한다고 생각합니다. (정확한 산술을 사용하는 답변을 기대할 수 있다고 생각합니다. 여기서 CAS 언어 만 정확한 계산을 사용한다고 생각합니다.)
flawr

귀하의 조언에 따라 삭제를 취소했습니다 .
Mr. Xcoder

1

메이플 , 33 바이트

(즉, 내 2 센트)

with(LinearAlgebra):
IsDefinite(A)

PPCG에 오신 것을 환영합니다. 새줄이 필요하지만 메이플에 익숙하지 않습니까?
Jonathan Frech

@JonathanFrech 안녕하세요 감사합니다. 아닙니다. 나는 그것을 btw로 세지 않았다.
polfosol ఠ_ఠ

나에게 현재 바이트 수는 줄 바꿈 문자를 반영하는 것 같습니다.
Jonathan Frech


1
음 ... 이제 코드와 바이트 수가 일치하지 않습니다.
Jonathan Frech

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.