Matlab [Q, R, E] = qr (A) 뒤에 대응하는 LAPACK 기능은 무엇입니까?


12

나는 현재 행렬 대한 좋은 순위 추정치를 저렴하게 계산하려고합니다 . 따라서 나는 사용하여 columnt 피벗 QR 분해를 계산합니다.A

[Q,R,E]=qr(A)

Matlab에서. 사용하고 있는 의 랭크를 추정A

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

이것은 잘 작동하며 R의 모든 대각선 항목에 대한 플롯은 다음과 같습니다. 플롯 (정렬 (abs (diag (R)), 1, 'descend'), 'r *')

R

입력 행렬은 두 실험에서 모두 동일합니다.

내 질문은 이제 Matlab에서 컬럼 피벗 QR 분해를 사용하는 LAPACK 기능에 어떤 것입니까?

도움을 주셔서 감사합니다, Grisu

편집 : DGEQPF는 동일한 잘못된 결과를 제공합니다.

편집 2 :

  • AE+sign(E,F)
  • A
  • R
  • LAPACK 3.4.0을 OpenBlas / GotoBLAS (64 비트)와 함께 사용했습니다
  • Matlab 7, 2007b, 2010b Linux 32 비트

Edit3 :-GDB를 사용하여 Matlab 2010b가 DGEQP3을 호출한다는 것을 알았습니다 ./usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so LAPACK을 사용하여 왜 잘못된 결과를 얻습니까?


여기서 공유 할 수있는 더 작은 매트릭스로 동일한 동작을 유발할 수 있습니까?
GertVdE

A

A

Grisu-매트릭스를보고 싶습니다. 그러나 www-e.uni-magdeburg.de/makoehle/A.mtx.gz 링크 는 더 이상 활성화되지 않습니다 (현재 어쨌든). 매트릭스에 대한 현재 링크가 있습니까? 감사합니다, Les Foster

@LeslieFoster-scicomp에 오신 것을 환영합니다!
Aron Ahmadia

답변:


7

현재 두 가지 문제가 있습니다.

  • A
  • MATLAB의 내부 라이브러리와 동일한 소프트웨어 스택이 있습니까?

조밀하거나 드문?

ADGEQP3[Q,R,E] = qr(A)A

MATLAB의 내부 라이브러리와 동일한 소프트웨어 스택이 있습니까?

아마도 그렇지 않습니다. 다른 결과를 얻는 한 가지 이유 일 수 있습니다.

QR 인수 분해를 사용하는 라이브러리를 단위 테스트 할 때이 문제가 발생했습니다. MATLAB을 사용하여 작업 프로토 타입을 작성했으며 LAPACK 또는 NumPy를 사용하는 것과 다른 결과를 얻었습니다. 내가 알 수있는 한, MathWorks는이 정보를 쉽게 찾을 수 없기 때문에 MATLAB은 버전 3.1.1 이전의 LAPACK 버전과 Intel의 MKL BLAS 라이브러리 (Windows, Intel Mac 및 Linux) 버전 9.1을 사용합니다. 이상 ( 여기 참조 ). SuiteSparse MATLAB 버전에 대한 정보를 찾을 수 없습니다. 온라인을 파거나 시스템의 라이브러리 파일을 살펴보면 추가 정보를 얻을 수 있습니다. 소프트웨어 패키지에서 동일한 라이브러리와 비교할 수 있도록 MATLAB이 링크하는 라이브러리를 변경할 수 있습니다. Eric Chu는 훌륭한 글쓰기를 제공합니다그것은 적어도 MATLAB의 BLAS 라이브러리를 자신의 것으로 바꿀 수있는 방법을 보여줍니다 (물론, 당신은 자신의 위험 부담). 그는 LAPACK으로도 같은 일을 할 수 있다고 제안합니다. MATLAB이 사용하는 SuiteSparse 버전을 자신의 버전으로 교체 할 수도 있습니다.

A=QRQR

시스템 BLAS 및 LAPACK 라이브러리를 사용하기 때문에 NumPy를 사용하여 QR 인수 분해에 대한 결과를 프로토 타이핑했습니다. NumPy와 SciPy는 MATLAB을 대체하는 대체품이 아닙니다. 두 라이브러리가 결합 된 MATLAB의 기능 중 일부가 부족하기 때문에이 특정 선형 대수 작업에서는 Python + NumPy + SciPy + Matplotlib가 제대로 작동합니다.


Matlab과 동일한 소프트웨어 스택을 얻는 것은 불가능하다고 생각합니다. 프로토 타이핑을 위해 다른 환경을 사용하는 것도 바람직하지 않습니다. 문제는 코드가 Matlab에서 올바르게 작동하지만 C에서는 작동하지 않는다는 것입니다.
MK aka Grisu

@ Grisu : 라이브러리에서 링크를 시도하지 않고 동일한 소프트웨어 스택을 얻는 것이 매우 어렵다고 생각합니다. 내가 혼란스럽게하는 것은 MATLAB의 결과가 정확하고 C의 결과가 잘못되었다는 것을 어떻게 알 수 있는지입니다. 이것은 알려진 속성을 가진 일종의 테스트 매트릭스입니까? 요컨대 AronAhmadia가 옳습니다. 아키텍처와 소프트웨어 스택을 복제하는 것 외에도 불안정한 알고리즘으로 동일한 결과를 얻을 수는 없습니다. 나는 2 년 전에 MATLAB 포럼에서 기본적으로 같은 것을 들었다.
Geoff Oxberry

제 생각에는 QR이 불안정하지 않습니다. 어떤 QR 분해가 올바른지 직접 확인할 수는 없지만 순위와 Q 매트릭스에서 프로젝터를 계산하면 거기서 좋은 결과를 얻었는지 나쁜 결과를 얻었는지 Matlab의 결과가 좋은지 쉽게 확인할 수 있습니다. 그러나 Matlab 라이브러리와 연결하려고합니다.
MK 일명 Grisu

@Grisu : 좋은 결과와 정확한 결과 사이에는 뚜렷한 차이가 있습니다. 최근에 계산이 잘못되어 결과가 멋지게 보입니다. 그럼에도 불구하고 계산이 잘못되었고 올바른 계산으로 인해 결과가 덜 인상적으로 보였습니다 (그러나 고맙게도 결과가 정확함을 보여줍니다). 직교 프로젝터 또는 경사 프로젝터를 계산하려고합니까? (논문의 상당 부분이 경사 프로젝터에 있기 때문에 묻습니다.)
Geoff Oxberry

1
@GeoffOxberry : FWIW, MATLAB의 내 버전에, 나는 호출 할 수 있습니다 internal.matlab.language.versionPlugins.blasinternal.matlab.language.versionPlugins.lapackBLAS 및 LAPACK 버전을 얻을
암로

6

순위 표시 소프트웨어 의 Leslie Foster 페이지를 참조하십시오 . 순위 표시 QR의 실패를 분석하는xGEQP3LAPACK Working Note를 참조하십시오 .

디버거에서 중단 점을 설정하고 스택을 검사하여 MATLAB이 사용하는 루틴을 찾을 수 있어야합니다. 마지막으로 필자는 몇 년 전에 MATLAB이 공유 라이브러리를 사용했는데,이 경우 심볼 이름을 제거 할 수 없으므로 호출 스택에 함수 이름이 표시됩니다 (하지만 디버깅 정보를 확실히 유지하지 않기 때문에 인수는 아님).


순위 공개 소프트웨어의 페이지가 도움이되지 않았습니다. RRQR 절차는 내 아이디어에 가장 먼저 사용했지만 열 피봇 팅 아이디어보다 더 나쁜 결과를 제공한다고 설명했습니다.
MK 일명 Grisu

2
@Grisu-도움이 되었어야합니다. 이 xGEQP3알고리즘은 순위를 공개하는 데 완전히 안전하지 않습니다. 당신은 당신이 올바른 결과를 얻을 수 있음을 보장하려는 경우, 당신은 같은 SVD 또는 안전한 QR 사용해야 xGEQPX또는 xGEQPY. 불안정한 알고리즘이 다른 아키텍처 또는 다른 구현에서 동일한 결과를 반환 할 것으로 기대할 수 없습니다 (MATLAB은 이전 LAPACK을 사용 중일 수 있습니다).
Aron Ahmadia

GEQP3가 순위를 공개하지는 않지만 RRQR 서브 루틴보다 더 정확한 결과를 제공합니다. SVD를 사용하는 것이 외부 알고리즘에서 너무 비쌉니다. 또한 LAWN-176의 저자 중 한 명과 이야기 할 것이며이 오류는 버그에 포함되지 않는다고 생각합니다. LAPACK 3.0.0의 DGEQPF / DGEQP3도 동일한 결과로 시도했습니다.
MK 일명 Grisu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.