2009-08-04 12 views
8

Có tăng cường không? Trong đó A, y và x là ma trận (thưa thớt và có thể rất lớn) và vectơ tương ứng. Có thể không biết y hoặc x.Giải pháp đại số tuyến tính của Boost cho y = Axe

tôi dường như không thể tìm thấy nó ở đây: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

+2

Vì tôi không biết gì về Boost hoặc C++, tôi sẽ chỉ nhận xét rằng có một giải pháp nếu và chỉ khi A là ma trận nghịch đảo. Nếu A không thể đảo ngược, thì giải pháp bình phương nhỏ nhất x = (A^T A)^(- 1) A^T y là điều gần nhất. –

+4

nói chung không phải là cách các phương trình ma trận được giải quyết (nghịch đảo thường là xấu, cả về tính ổn định số và tốc độ), thay vào đó bạn sẽ thấy hệ số QR hoặc LU theo sau bởi sự thay thế ngược. –

Trả lời

4

giải quyết tuyến tính nói chung là một phần của thư viện LAPACK mà là một phần mở rộng mức độ cao hơn của thư viện BLAS. Nếu bạn đang sử dụng Linux, Intel MKL có một số bộ giải mã tốt, được tối ưu hóa cả cho các ma trận dày đặc và thưa thớt. Nếu bạn đang ở trên cửa sổ, MKL có một thử nghiệm một tháng miễn phí ... và thành thật mà nói tôi đã không thử bất kỳ một trong những người khác ra khỏi đó. Tôi biết các gói Atlas có một thực hiện LAPACK miễn phí nhưng không chắc chắn làm thế nào nó là khó khăn để có được chạy trên cửa sổ.

Dù sao, hãy tìm kiếm thư viện LAPACK hoạt động trên hệ thống của bạn.

+4

Lưu ý: LAPACK không phải là bộ giải nén thưa thớt, vì vậy nó không lưu trữ ma trận thưa thớt rất hiệu quả, cũng như không giải quyết được các hệ thống thưa thớt đặc biệt hiệu quả. MKL của Intel có chứa các bộ giải quyết thưa thớt (http://software.intel.com/sites/products/collateral/hpc/mkl/mkl_brief.pdf), đặc biệt là bộ giải quyết thưa thớt trực tiếp PARDISO (http: //www.pardiso-project .org) Bạn có thể tìm hiểu tổng quan về phần mềm đại số tuyến tính số lượng dày và thưa thớt tại http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock

+0

Thực tế là điều đó, và trừ khi bạn đang xây dựng một sản phẩm thương mại tôi sẽ đề nghị gửi thư viện MKL và chỉ nhận được PARDISO, bạn sẽ tiết kiệm tiền và tiết kiệm phải đối phó với các vấn đề cấp phép. – DeusAduro

3

Đọc tài liệu tăng cường, dường như không giải quyết được tệp w.r.t x được triển khai. Giải quyết trong y chỉ là một vấn đề của sản phẩm ma trận-vector, mà dường như được thực hiện trong ublas.

Một điều cần lưu ý là blas chỉ thực hiện các thao tác 'dễ dàng' như cộng, phép nhân, v.v ... của các loại vectơ và ma trận. Bất cứ điều gì cao cấp hơn (giải quyết vấn đề tuyến tính, như "giải quyết trong x y = A x", vectơ và đồng nguyên tử) là một phần của LAPACK, được xây dựng trên đầu trang của BLAS. Tôi không biết những gì tăng cung cấp trong sự tôn trọng đó.

3

Điều chỉnh gói đại số tuyến tính của Boost tập trung vào "ma trận dày đặc". Theo như tôi biết, gói của Boost không có bất kỳ bộ giải mã tuyến tính nào. Làm thế nào về việc sử dụng mã nguồn trong "Công thức số trong C (http://www.nr.com/oldverswitcher.html)"?

Lưu ý. Có thể có lỗi chỉ mục tinh tế trong mã nguồn (một số mã sử dụng chỉ mục mảng bắt đầu từ 1)

+0

+1 cảm ơn về liên kết. –

+1

Nó không phải là một lỗi đó là một tính năng! Đó là làm cho các thuật toán trở nên ngon miệng hơn cho người dùng Fortran. –

3

Hãy xem JAMA/TNT. Tôi đã chỉ sử dụng nó cho ma trận không thưa thớt (bạn có thể muốn các QR hoặc LU factorizations, cả hai đều có phương pháp tiện ích giải quyết), nhưng nó dường như có một số cơ sở cho ma trận thưa thớt.

4

Một trong những giải quyết tốt nhất cho Ax = b, khi A là thưa thớt, là Tim Davis UMFPACK

UMFPACK tính một phân hủy LU thưa thớt của A. Đây là thuật toán mà được sử dụng đằng sau hậu trường trong Matlab khi bạn nhập x=A\b (và A thưa thớt và hình vuông). UMFPACK là phần mềm miễn phí (GPL)

Cũng lưu ý nếu y = Axe và x được biết, nhưng y không, bạn tính toán y bằng cách thực hiện một vectơ ma trận thưa thớt nhân, chứ không phải bằng cách giải một hệ tuyến tính.

17

có, bạn có thể giải phương trình tuyến tính bằng thư viện ublas của boost. Dưới đây là một cách ngắn sử dụng LU-động lực và back-thay thế để có được những nghịch đảo:

using namespace boost::ublas; 

Ainv = identity_matrix<float>(A.size1()); 
permutation_matrix<size_t> pm(A.size1()); 
lu_factorize(A,pm) 
lu_substitute(A, pm, Ainv); 

Vì vậy, để giải quyết một hệ thống tuyến tính Ax = y, bạn sẽ giải quyết phương trình xuyên (A) Axe = xuyên (A) y bằng cách lấy nghịch đảo của (trans (A) A)^- 1 để lấy x: x = (trans (A) A)^- 1Ay.

+10

Nếu tất cả những gì bạn cần là một giải pháp cho Ax = y, chỉ cần sử dụng 'permutation_matrix pm (A.size1()); lu_factorize (A, pm); lu_substitute (A, pm, y), 'và' y' được thay thế bằng giải pháp. – Joey