Hàm LAPACK tương ứng đằng sau Matlab [Q, R, E] = qr (A) là gì?


12

Tôi hiện đang cố gắng với giá rẻ tính toán một ước lượng tốt thứ hạng cho một ma trận . Do đó, tôi tính toán phân tách QR xoay vòng bằng cách sử dụngA

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

trong Matlab. Tôi ước tính thứ hạng của bằng cách sử dụngA

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

Điều này hoạt động tốt và một âm mưu trên tất cả các mục chéo của R trông giống như: cốt truyện (sắp xếp (abs (diag (R)), 1, 'hậu duệ'), 'r *')

Nếu chuyển toàn bộ thuật toán sang C / Fortran, tôi thay thế [Q, R, E] = qr (A) bằng DGEQP3 từ LAPACK, cũng tính toán phân tách QR xoay vòng cột. Nhưng nếu tôi sử dụng cùng một ước tính cho thứ hạng, tôi hầu như nhận được một cái gì đó sai. Cốt truyện tương tự cho được sản xuất từ ​​DGEQP3 trông giống như R

Ma trận đầu vào hoàn toàn giống nhau cho cả hai thí nghiệm.

Câu hỏi của tôi bây giờ là chức năng LAPACK nào mà cột xoay vòng phân tách QR từ Matlab dựa vào?

Cảm ơn vì sự giúp đỡ, Grisu

Chỉnh sửa: DGEQPF cho kết quả sai tương tự.

Chỉnh sửa2:

Chỉnh sửa: ./bin/glnx86/mllapack.so Tại sao tôi nhận được kết quả sai khi sử dụng LAPACK (3.4.0 bao gồm các bản sửa lỗi được đề cập trong Lưu ý làm việc 176)?


Bạn có thể kích động hành vi tương tự với một ma trận nhỏ hơn mà bạn có thể chia sẻ ở đây không?
GertVdE

A

A

Grisu - Tôi rất thích nhìn vào ma trận của bạn. Tuy nhiên, liên kết www-e.uni-magdeburg.de/makoehle/A.mtx.gz không còn hoạt động nữa (tại thời điểm hiện tại, dù sao đi nữa). Bạn có một liên kết hiện tại đến ma trận? Cảm ơn, Les Foster

@LeslieFoster - Chào mừng bạn đến với scicomp!
Aron Ahmadia

Câu trả lời:


7

Có hai vấn đề trong tay:

  • A
  • Bạn có ngăn xếp phần mềm giống như các thư viện nội bộ của MATLAB không?

Dày đặc hay thưa thớt?

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

Bạn có ngăn xếp phần mềm giống như các thư viện nội bộ của MATLAB không?

Có lẽ là không, đó có thể là một lý do khiến bạn nhận được kết quả khác nhau.

Tôi gặp phải vấn đề này khi đơn vị kiểm tra một thư viện mà tôi đang viết có sử dụng các yếu tố QR. Tôi đã sử dụng MATLAB để tạo nguyên mẫu cho công việc của mình và nhận được kết quả khác so với sử dụng LAPACK hoặc NumPy. Theo như tôi có thể nói, vì MathWorks không làm cho thông tin này dễ tìm thấy, MATLAB sử dụng một verson của LAPACK không sớm hơn phiên bản 3.1.1 và thư viện MKL BLAS của Intel (cho Windows, Intel Mac và Linux) phiên bản 9.1 hoặc cao hơn (xem tại đây ). Tôi không thể tìm thấy bất cứ điều gì về phiên bản sử dụng MATLAB của SuiteSparse. Bằng cách đào xung quanh trực tuyến hoặc xem các tệp thư viện cho hệ thống của bạn, bạn có thể thu thập thông tin bổ sung. Bạn có thể thử thay đổi các thư viện mà MATLAB liên kết thành để có thể so sánh với các thư viện tương tự trên các gói phần mềm; Eric Chu cung cấp một bài viết hayđiều đó cho thấy ít nhất làm thế nào bạn có thể thay thế thư viện BLAS của MATLAB bằng thư viện của riêng bạn (tất nhiên, bạn phải tự chịu trách nhiệm về việc này). Ông đề nghị rằng bạn cũng có thể làm điều tương tự với LAPACK. Thậm chí có thể thay thế phiên bản SuiteSparse mà MATLAB sử dụng bằng phiên bản của riêng bạn.

A=QRQR

Tôi đã kết thúc việc sử dụng NumPy để tạo nguyên mẫu cho kết quả của mình cho nhân tố QR, bởi vì nó sử dụng các thư viện BLAS và LAPACK của hệ thống. NumPy và SciPy không phải là sự thay thế thả xuống cho MATLAB, vì hai thư viện kết hợp thiếu một số chức năng của MATLAB, nhưng đối với tác vụ đại số tuyến tính cụ thể này, Python + NumPy + SciPy + Matplotlib sẽ hoạt động tốt.


Tôi nghĩ việc có được cùng ngăn xếp phần mềm như Matlab. Sử dụng một môi trường khác để tạo mẫu cũng không muốn. Vấn đề là mã hoạt động chính xác trong Matlab, nhưng không phải trong C.
MK hay còn gọi là Grisu

@Grisu: Tôi nghĩ rằng sẽ rất khó để có được cùng một phần mềm, không cố gắng liên kết trong các thư viện của họ. Điều tôi bối rối là làm thế nào bạn biết kết quả trong MATLAB là chính xác và kết quả trong C là sai. Đây có phải là một số loại ma trận thử nghiệm có thuộc tính được biết đến? Hơn nữa, AronAhmadia đã đúng; ngoài việc sao chép kiến ​​trúc và ngăn xếp phần mềm, bạn không thể mong đợi nhận được kết quả tương tự với thuật toán không ổn định. Về cơ bản, tôi đã được nói điều tương tự trong các diễn đàn MATLAB hai năm trước.
Geoff Oxberry

Theo tôi thì QR không ổn định. Tôi không thể trực tiếp kiểm tra phân tách QR nào là đúng, nhưng từ thứ hạng và ma trận Q tôi tính toán một máy chiếu và ở đó tôi có thể dễ dàng xác minh xem kết quả tốt hay xấu và kết quả từ Matlab có tốt không. Nhưng tôi cố gắng liên kết với các thư viện Matlab.
MK aka Grisu

@Grisu: Có sự khác biệt rõ rệt giữa kết quả tốt và kết quả chính xác. Gần đây tôi đã thực hiện một phép tính không chính xác làm cho kết quả của tôi trông tuyệt vời. Tuy nhiên, tính toán sai và tính toán chính xác làm cho kết quả của tôi trông kém ấn tượng hơn (nhưng may mắn thay, minh họa rằng kết quả của tôi là chính xác). Bạn đang cố gắng tính toán một máy chiếu trực giao hay máy chiếu xiên? (Tôi hỏi vì phần quan trọng trong luận án của tôi là trên máy chiếu xiên.)
Geoff Oxberry

1
@GeoffOxberry: fwiw, trên phiên bản MATLAB của tôi, tôi có thể gọi internal.matlab.language.versionPlugins.blasinternal.matlab.language.versionPlugins.lapacknhận phiên bản BLAS và LAPACK
Amro

6

Xem trang của Leslie Foster trên phần mềm tiết lộ thứ hạng . Xem thêm Lưu ý làm việc LAPACKxGEQP3 này phân tích các thất bại của QR tiết lộ thứ hạng .

Bạn sẽ có thể tìm hiểu những thói quen MATLAB sử dụng bằng cách đặt các điểm dừng trong trình gỡ lỗi và kiểm tra ngăn xếp. Lần trước tôi đã nhìn, thừa nhận vài năm trước, MATLAB đã sử dụng các thư viện dùng chung, trong trường hợp đó, tên biểu tượng không thể bị xóa, do đó bạn sẽ thấy tên hàm trên ngăn xếp cuộc gọi (nhưng không phải là đối số vì nó chắc chắn không giữ thông tin gỡ lỗi).


Trang về phần mềm tiết lộ thứ hạng không giúp được gì. Quy trình RRQR được mô tả có điều đầu tiên tôi sử dụng trong ý tưởng của mình nhưng nó cho kết quả thậm chí còn tồi tệ hơn ý tưởng xoay vòng cột.
MK aka Grisu

2
@Grisu - Nó nên đã giúp bạn. Các xGEQP3thuật toán không phải là hoàn toàn an toàn cho tiết lộ xếp hạng. Nếu bạn muốn đảm bảo rằng bạn nhận được kết quả đúng, bạn nên sử dụng SVD hoặc QR an toàn hơn như xGEQPXhoặc xGEQPY. Bạn không thể mong đợi một thuật toán không ổn định sẽ trả về cùng một kết quả trên các kiến ​​trúc khác nhau hoặc trong các triển khai khác nhau (MATLAB có thể đang sử dụng LAPACK cũ hơn).
Aron Ahmadia

Tôi biết rằng GEQP3 không tiết lộ thứ hạng nhưng, nó cho kết quả chính xác hơn các chương trình con RRQR. Sử dụng một SVD là quá đắt trong thuật toán bên ngoài của tôi. Tôi cũng sẽ nói chuyện với một trong những tác giả của LAWN-176 và anh ấy nghĩ rằng lỗi này không nằm trong lỗi này. Tôi cũng đã thử DGEQPF / DGEQP3 từ LAPACK 3.0.0 với kết quả tương tự.
MK aka Grisu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.