2013-07-01 5 views
0

직사각형 행렬의 직교 정규 기반을 계산해야하는 프로젝트를 수행 중이며이 행렬은 랭크가 부족하거나 그렇지 않을 수도 있습니다. matlab에서 우리는이 문제를 처리하기 위해 svd를 기반으로하는 함수 orth()를 호출 할 수 있지만 C에서 구현해야합니다. Gram-Schmidt를 사용하려고했는데 행렬이 풀 랭크 일 때 제대로 작동합니다. 이 문제를 해결할 수있는 C 라이브러리가 있습니까? 아니면 C에서 구현에 대한 몇 가지 힌트? 고마워.랭크가 부족한 직사각형 행렬에 대한 정규직 기준을 계산하는 방법

답변

1

행렬에 k가 랭크가 부족한 경우 (예 : 4x3 행렬이 랭크 2이고 k = 1 인 경우) k 개의 임의 벡터를 생성 한 다음 이전에 다른 정규화 된 벡터의 구성 요소를 뺄 필요가 있습니다 그람 - 슈미트 (Gram-Schmidt)가 무작위 벡터로부터 생성 한 것이다.

2 × 2 행렬

1 1 
0 0 

그램 - 슈미트하면 그것은

1 0 
0 0 

입니다 얻을 것이다 :

당신이 다음의 예를 볼 수있는 벡터를 직접 생성 할 필요가있다 원래의 열 공간에는 단일 방향 만 포함되기 때문입니다. 만약 (eps는 1E-10와 같은 충분히 작은 부동 소수점 수이다 norm(v2) < eps) 이러한 경우를 검출하는 경우, 두 번째 벡터 v2 대한 임의의 벡터를 생성

1 0.2 
0 -0.3 

v1

의 성분을 감산 말할
1 0 
0 -0.3 

등의 현재 v2

1 0 
0 1 

정상화 원래 열 공간에 존재하지 않는 방향을 구성 할 수 있습니다.

계산 속도가 우려되는 경우,이 시점이나 생산 코드에서 가능한 경우 SVD를 피해야합니다. SVD와 매트릭스 매트릭스 제품 모두 O (N^3) 복잡성이지만 SVD는 일반적으로 매트릭스 매트릭스 제품에 비해 10 배 더 느린 계수를 가지고 있습니다. 사실, 이러한 문제에서 SVD는 조사에 유용 할 수 있지만 더 나은 도구는 QR 분해이어야합니다. QR 분해는 본질적으로 그람 - 싯트 (Gram-Schidt)이지만 더 나은 수치 안정성을 위해 다른 순서로 작동해야합니다.

+0

고맙습니다. 나는 Modified Gram-Schmidt를 시도했지만 다른 eps는 나에게 안정되지 않은 다른 대답을 줄 것이다. 계급 공개 QR이 더 좋을 것이라고 생각하십니까? –

+0

당신의 매트릭스가 랭크가 부족한지는 당신이 선택한 EPS에 달려 있다고 생각합니다. 즉, 행렬 A에서 Gram-Schmidt를 수행하고 그램 - 슈미트 뺄셈 후의 표준이 eps보다 작은 열 벡터를 만날 때, 행렬 A는 풀 랭크가 아니라고 말합니다. 즉, eps의 선택에 따라 "전체 순위"에 대한 정의가 변경됩니다. 따라서 제 생각으로는 고유 한 것은 아니지만 QR 또는 수정 된 그램 슈미트가 수치 적으로 안정적이라는 전적인 평가가 있습니다. 그 질문에 대답합니까? –

+0

예, 당신의 요점이 있습니다. –

0

LAPACK 라이브러리를 사용해보십시오. 그것은 svd 루틴 (및 많은 다른 사람)있다.