2011-02-08 45 views
6

Tôi có thể nhận được giải pháp hệ thống tuyến tính nhanh được viết bằng D ở đâu? Nó sẽ có thể để có một ma trận vuông Một và một vector b và giải quyết các phương trình Axe = b cho b và lý tưởng, cũng thực hiện đảo ngược rõ ràng về Một. Tôi có một bản thân mình viết, nhưng nó khá chậm, có lẽ vì nó hoàn toàn là bộ nhớ cache ngây thơ. Tuy nhiên, đối với trường hợp sử dụng của tôi, tôi cần một cái gì đó với tuyệt đối không thể thương lượng yêu cầu, sau tức là nếu nó không đáp ứng các, sau đó tôi không có thoả chăm sóc như thế nào tốt, nếu không thì là:Giải pháp hệ thống tuyến tính nhanh cho D?

  1. Phải là miền công cộng được cấp phép, Giấy phép nâng cao hoặc một số giấy phép cho phép tương tự. Lý tưởng nhất là không nên yêu cầu phân bổ trong các tệp nhị phân (tức là không phải BSD), mặc dù điểm này có phần thương lượng.

  2. Phải được viết bằng D thuần túy hoặc dễ dàng dịch sang thuần túy D. Mã Fortran không thể sửa chữa (tức là LAPACK) không phải là câu trả lời hay cho dù nó có nhanh như thế nào.

  3. Phải được tối ưu hóa cho các hệ thống lớn (nghĩa là 1000). Tôi không muốn một cái gì đó được thiết kế cho các lập trình viên trò chơi để giải quyết các ma trận 4x4 thực sự, rất nhanh.

  4. Không được liên kết chặt chẽ với một thư viện khổng lồ mà tôi không cần.

Chỉnh sửa: Lý do cho các yêu cầu dường như điên rồ này là tôi cần mã này cho thư viện nguồn mở được cấp phép được phép mà tôi không muốn có bất kỳ phụ thuộc bên thứ ba nào.

+1

Thuộc tính A có gì? Đối xứng? Tích cực? Tích cực nhất định? Bị dải? Thưa thớt? Bạn yêu cầu điều gì đó nhanh chóng, miền công cộng và loại trừ LAPACK! Nó không có vẻ như bạn thực sự muốn có một giải pháp! Bạn có biết rằng tất cả các bộ giải mã tuyến tính có hiệu năng được lấy từ Sổ tay không? –

+0

"Sổ tay" là gì? – Baxissimo

+0

@Baxissimo "Sổ tay cho tính toán tự động: Đại số tuyến tính" ban đầu được xuất bản năm 1972, tác giả JH Wilkinson và C. Reinsch –

Trả lời

3

Nếu bạn không thích mã Fortran, một thư viện ma trận dày đặc C++ nhanh có hỗ trợ đa lõi khiêm tốn, mã được viết tốt và giao diện người dùng tốt là Eigen. Nó nên được đơn giản để dịch mã của nó để D (hoặc để có một số thuật toán từ nó).

Và bây giờ là "suy nghĩ về yêu cầu của bạn": có một lý do tại sao "mọi người" (Mathematica, Matlab, Maple, SciPy, GSL, R, ...) sử dụng ATLAS/LAPACK, UMFPACK, PARDISO, CHOLMOD v.v ... Đó là công việc khó khăn để viết nhanh, đa luồng, bộ nhớ hiệu quả, xách tay và số ổn định ma trận giải quyết (tin tưởng tôi, tôi đã cố gắng). Rất nhiều công việc khó khăn này đã đi vào ATLAS và phần còn lại.

Vì vậy, cách tiếp cận của tôi sẽ là viết các ràng buộc cho thư viện có liên quan tùy thuộc vào loại ma trận của bạn và liên kết từ D với giao diện C. Có lẽ các ràng buộc trong multiarray là đủ (tôi đã không cố gắng). Nếu không, tôi khuyên bạn nên xem xét một thư viện C++ khác, cụ thể là uBlasbindings tương ứng cho các ý tưởng.

+0

Vấn đề với LAPACK, v.v. là tôi cần điều này cho một phần nhỏ của mã và không muốn phụ thuộc. Ngoài ra, tôi không thể sử dụng Eigen vì nó là LGPL, vì vậy bản dịch D của tôi sẽ được che phủ bởi copyleft. – dsimcha

+0

@dsimcha: Có ý nghĩa.Có lẽ nhìn vào một phần của trục P LU và nguồn tam giác hóa của Eigen có thể hữu ích. Tôi nghi ngờ rằng các thuật toán được bao phủ bởi LGPL (vì chúng có nhiều khả năng dựa trên nghiên cứu học thuật trước đây), nhưng tôi không phải là luật sư. Đối với phụ thuộc LAPACK: nó có thể không lớn như nó trông. LAPACK được cài đặt sẵn trên OS X, hoặc được cài đặt sẵn hoặc một apt-get trên Unix/Linux, và Windows nhị phân có sẵn. Nhưng tôi không muốn nổi một con ngựa chết ... – stephan

+0

Tất cả những gì tôi biết là tôi chưa bao giờ quản lý được LAPACK hoạt động trên Windows lần trước tôi đã cố gắng vì một lý do không liên quan. (Tôi không nhớ chi tiết.) Có lẽ nếu tôi tìm hiểu làm thế nào, tôi sẽ giữ thói quen D chậm chạp của tôi xung quanh như mặc định và thêm một -version = LAPACK cờ vì vậy nếu bạn có LAPACK cài đặt và cần tốc độ, bạn có thể lấy nó. (Hiệu suất của bộ giải này chỉ quan trọng trong trường hợp tương đối bất thường là N lớn. Đối với các thuật toán N nhỏ, ngây thơ đủ nhanh.) – dsimcha

Các vấn đề liên quan