2013-05-22 1 views
4

Matlab에서 행렬이 양수인지 여부를 확인하는 가장 빠른 (런타임) 방법은 무엇입니까? 이 테스트는 크기 (차원)가 10000에서 100000까지 다양하게 많은 희소 행렬에 대해 실행되었습니다.행렬이 SPD인지 확인

편집 :

은 콜레 내 목적을 위해 턱없이 비싸다. 행렬이 spd 될 수 있다는 표시를 주면 더러운 검사를 먼저 수행해야합니다. 그러면 더 정확하게 행렬을 확인할 수 있습니다.

답변

3

here과 마찬가지로 chol 함수를 사용하여 행렬이 PD인지 여부를 확인할 수 있습니다.

CHOL 함수는 선택적인 두 번째 출력 인수 "p" 을 제공합니다.이 행렬은 양의 확정적 인 것으로 확인되면 0입니다. CHIL 함수는 출력 인수가 인 경우에만 오류를 반환하고 양수가 아닌 행렬 도 제공됩니다. 참고 : CHOL은 입력 행렬이 대칭이어야하며 행렬의 위쪽 삼각형 부분을보아야합니다 ( ).

대칭에 관해서는 다음과 같은 기능을 사용할 수 있습니다

issym = @(m) isequal(tril(x), triu(x)'); 
+0

콜레 스키는 제 목적을 위해 엄청나게 비쌉니다. 먼저 행렬이 spd 될 수 있다는 표시를하면 더티 체크가 먼저 필요하고, 그 행렬을 더 신뢰할 수있게 CHOL을 사용하여 체크 할 수 있습니다. – zimbra314

+1

예비 테스트를 원할 경우, 확실한 테스트를 직접 수행하십시오. v '* A를 확인하십시오. * v는 계산을 매우 빠르게하는 몇 개의 벡터 (들)에 대한 것입니다. 일부 벡터의 경우 행렬의 단일 요소를 검사하는 양에 해당합니다. –

1

나는 당신이 당신의 행렬의 고유 값을 살펴있을 수 있습니다 생각을하고, 그들은 모두 별개의 실제 가치가 있는지 여부를 확인합니다.

당신은, 그러므로, 다음과 같이 eig 함수를 호출 할 생각 :

[V,D] = eig(A) 

내가이 효율적으로 할 수있는 비 사소한 문제라고 생각이

2

도움이되기를 바랍니다. Cholesky 알고리즘은 행렬이 양의 확률이 아니라면 실패 할 것이므로 자신을 구현하는 것이 가장 좋을 수 있습니다. 입력이 양의 확률이 아니기 때문에 알고리즘이 실패 할 때 수행 할 작업을 제어 할 수 있다는 장점도 있습니다. 내 수학 프로그래밍을 위해 Matlab보다는 C#을 사용하고, Cholesky 구현은 소수에 불과하므로 어렵지 않습니다. 다른 사람의 알고리즘을 사용하는 경우 구현 방법에 따라 비대칭 행렬을 입력하면 잘못된 결과가 발생할 수 있습니다. 일부 구현에서는 행렬이 대칭이라고 가정하기 때문입니다. 내가 생각할 수있는 유일한 빠른 사전 테스트는 the matrix trace을 확인하는 것입니다. 행렬이 SPD 인 경우 양수가됩니다.