2010-06-26 24 views
7

Tôi cần tính toán giá trị riêng biệt lớn nhất của ma trận (thưa thớt). Tôi đã thực hiện phương pháp lặp lại sức mạnh, nhưng nó quá chậm để hội tụ, vì vậy tôi muốn sử dụng một gói cho nó. có ai có đề cử gì không?Gói C++ nhỏ nào tốt nhất để tính toán giá trị riêng biệt lớn nhất của ma trận?

Gói tính toán eigenvalue tốt nhất là gì? Tốt nhất là nhỏ và dễ biên dịch.

Trả lời

0

Ít nhất nếu bộ nhớ phục vụ, một khả năng sẽ là Boost::uBlas. Trong khi Boost nói chung là khá lớn, thì bản thân nó cũng khá hợp lý hơn một chút. Hơn nữa, nếu bộ nhớ phục vụ nó là một thư viện chỉ tiêu đề, vì vậy việc sử dụng nó khá dễ dàng (bạn không phải xây dựng thư viện trước, thiết lập bất cứ thứ gì cho liên kết, v.v.)

Edit: Tôi nên thêm tính toán Giá trị riêng/véc tơ nói chung là khá chậm, ngay cả với mã được tối ưu hóa khá. Tùy thuộc vào chính xác những gì bạn đang làm, bạn nên xem xét các phương pháp (ví dụ: một ví dụ) cho phép bạn nhận được bằng tính toán giá trị Eigenvalue chỉ là một tập hợp con của ma trận (ví dụ: Landmark Multidimensional Scaling).

+0

Cảm ơn, nhưng nó có chức năng trả lại giá trị riêng lớn nhất? Tôi không thấy nó trong tài liệu. – Erin

+0

không có hàm LAPACK để trả về giá trị riêng biệt lớn nhất. Bạn có thể làm một đường chéo ma trận brute force cung cấp cho bạn tất cả các giá trị riêng, nhưng điều đó sẽ bị nghẹt thở nhanh hơn nhiều nếu bạn sử dụng các trình giải quyết Lanzos chuyên biệt. –

2

Tôi không thể cung cấp cho bạn bất kỳ chi tiết nào vì tôi chưa tự mình sử dụng, nhưng tôi nghĩ ARPACK có thể trợ giúp, và đặc biệt là ARPACK ++, đó là gói C++ như gói ban đầu ở Fortran77. Tôi nghĩ rằng các eigs chức năng MATLAB() sử dụng điều này để tìm giá trị riêng biệt lớn nhất (và eigenvector tương ứng). Từ những gì tôi nghe t sẽ có thể giao tiếp với STL là tốt.

MATLAB sử dụng các quy trình Fortran77 DSAUPD, DSEUPD, DNAUPD, DNEUPD, ZNAUPD và ZNEUPD. Họ có vẻ như những người tìm kiếm trong ARPACK ++.

Check it out here.

+0

Thật vậy, ARPACK là một trong những cái tốt nhất hiện có (+1). Không thể xác minh cho giao diện C++ của nó mặc dù. –