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.blas및 internal.matlab.language.versionPlugins.lapackBLAS 및 LAPACK 버전을 얻을
— 암로

6

순위 표시 소프트웨어 의 Leslie Foster 페이지를 참조하십시오 . 순위 표시 QR의 실패를 분석하는xGEQP3 이 LAPACK 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.