giải


12

Tôi đang chuyển một mã hiện có từ MATLAB sang C ++ và có một hệ thống tuyến tính để giải (chứ không phải là dạng A x = b điển hình hơnxA=bAx=b )

Ma trận dày đặc và có dạng chung, nhưng không lớn hơn 1000x1000. Vì vậy, trong MATLAB, giải pháp được tìm thấy bởi hàm hoặc ký hiệu dấu gạch chéoAmrdivide(b,A)x = b/A;

Tôi nên giải quyết vấn đề này như thế nào trong mã C ++ của mình bằng các thói quen BLAS và LAPACK?

Tôi quen thuộc với thói quen LAPACK DGESVgiải cho xAx=bx .

Vì vậy, một suy nghĩ tôi có là thực hiện một số thao tác bằng cách sử dụng danh tính chuyển vị ma trận:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

Sau đó giải quyết các hình thức cuối cùng bằng cách sử dụng DGESVhoạt động trên chuyển đổi . (vì vậy chi phí để chuyển đổi AATA và chi phí để giải quyết hệ thống)

Có cách tiếp cận nào hiệu quả hơn hay tốt hơn không ?

Tôi đang làm việc với các lớp ma trận và vectơ cũng như triển khai BLAS từ thư viện BBLST uBLAS cũng như các ràng buộc với các thói quen của thư viện LAPACK. Tôi đã sử dụng thiết lập này thành công cho các hoạt động khác và hy vọng tìm thấy một giải pháp giới hạn cho các thư viện này.

Ngoài ra, tôi cần lưu ý rằng tôi chỉ thực hiện loại hoạt động này một vài lần trong khi thiết lập mã, vì vậy hiệu suất không phải là vấn đề quan trọng.

Có lẽ MATLAB này tài liệu trên mrdividelà hữu ích cho người khác.

Câu trả lời:


10

Câu trả lời tầm thường cho hình vuông : sử dụng mà cũng giải quyết cho A T x = b khi .AdgesvxATx=bTRANS = 'T'

Xin lưu ý rằng với BLAS hoặc LAPACK, bạn hầu như không phải hoán đổi (hoán đổi các phần tử trong bộ nhớ) một ma trận: hầu hết các chương trình con có một TRANSđối số để phù hợp với hoạt động trên ma trận chuyển vị hoặc trên ma trận được lưu trữ với bố cục bộ nhớ khác. (Chuyển vị tương đương với việc thay đổi bố cục bộ nhớ liền kề Fortran thành C-contiguos và ngược lại.)


Cảm ơn câu trả lời và giải thích! Tôi đã thực hiện rất ít công việc với LAPACK và bây giờ tôi biết tìm kiếm tùy chọn TRANS. Tôi gặp khó khăn khi giải quyết tranh luận TRANS boost::numeric::bindings::lapack::gesvx(), nhưng đây không phải là một phần câu hỏi của tôi ở đây. Nếu tôi thành công, tôi sẽ quay lại với một lưu ý về cách thực hiện.

Tôi có một giải pháp làm việc bằng cách sử dụng gesvx(), mặc dù không phải không có một số vấp ngã trên đường đi. Khi đối số TRANS là 'T', tài liệu LAPACK cho biết gesvxgiải quyết , nhưng thực sự nó giải quyết A T X T = B T vì hình thức của các đối số đầu vào XB dự kiến ​​sẽ không được chuyển đổi hình thức. Vì vậy, đối số A được hoán vị, trong khi XBATX=BATXT=BTXBAXB không phải là. Tuyệt, điều đó thuận tiện hơn. Nếu bất cứ ai khác vấp phải điều này khi cố gắng sử dụng các liên kết số tăng cường, tôi sẽ nói rằng tôi không thể có được giao diện chuyển vị được sử dụng trong soln này. để làm việc thông qua các ràng buộc.

gesvxboost::numeric::bindingsAT trong trans()hàm. Điều này xác định tham số là loại chuyển vị : boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
NoahR

0

Bạn có thể tính toán nghịch đảo giả của Một, bằng cách sử dụng phân tách QR của SVD, cả hai đều được bao gồm trong LAPACK.

xMột= =bxQR= =bx= =bR-1QT

Điều này sẽ làm việc cho bất kỳ hình chữ nhật Một.


3
Nếu Một là hình chữ nhật (không phải hình vuông), vậy thì Rvà biểu thức R-1không định nghĩa được.
Geoff Oxberry
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.