Độ phức tạp của ma trận đảo ngược trong numpy


11

Tôi đang giải các phương trình vi phân đòi hỏi phải đảo các ma trận vuông dày đặc. Ma trận đảo ngược này tiêu tốn phần lớn thời gian tính toán của tôi, vì vậy tôi đã tự hỏi liệu tôi có đang sử dụng thuật toán nhanh nhất có sẵn không.

Lựa chọn hiện tại của tôi là numpy.linalg.inv . Từ số của tôi, tôi thấy rằng nó có tỷ lệ là trong đó n là số hàng, vì vậy phương thức này dường như là loại bỏ Gaussian.O(n3)

Theo Wikipedia , có những thuật toán nhanh hơn có sẵn. Có ai biết nếu có một thư viện thực hiện những điều này?

Tôi tự hỏi, tại sao không phải là numpy sử dụng các thuật toán nhanh hơn?


Bạn cần thực hiện ma trận của bạn trước. Nhìn vào Scipy. Thưa cho sự giúp đỡ của bạn. Nó chứa nhiều công cụ bạn cần.
Tobal

@Tobal không chắc tôi theo dõi ... bạn sẽ "thực hiện" ma trận như thế nào? và chính xác sẽ scipy.sparsegiúp như thế nào ?
GoHokies

@GoHokies scipy là một bổ sung cho numpy. Ma trận dày đặc / thưa thớt phải được thực hiện tốt trước khi bạn thực hiện một số tính toán, nó sẽ cải thiện tính toán của bạn. Xin vui lòng đọc này docs.scipy.org/doc/scipy/reference/sparse.html nó giải thích tốt nhất hơn tôi với tiếng anh xấu của tôi.
Tobal

@Tobal Câu hỏi đặc biệt đề cập đến ma trận dày đặc , vì vậy tôi không thấy làm thế nào scipy.sparsecó liên quan ở đây?
Christian Clason

2
@Tobal - Tôi nghĩ tôi vẫn không hiểu. Chính xác ý bạn là gì với "khuôn mẫu của ma trận của bạn" và "ma trận phải được thực hiện tốt trước khi bạn thực hiện một số tính toán"? Về nhận xét cuối cùng của bạn, chắc chắn bạn sẽ đồng ý rằng các kỹ thuật có thể được sử dụng cho ma trận thưa thớt và dày đặc là rất khác nhau.
Wolfgang Bangerth

Câu trả lời:


20

(Điều này đang trở nên quá dài cho các bình luận ...)

n

  1. OnC1n3C2n2.xn

  2. Độ phức tạp giả định rằng mọi thao tác (số học) đều mất cùng một thời gian - nhưng điều này không đúng trong thực tế: Nhân một số các số có cùng một số nhanh hơn nhiều so với nhân một số lượng khác nhau . Điều này là do thực tế là cổ chai lớn trong điện toán hiện tại đang đưa dữ liệu vào bộ đệm, chứ không phải các hoạt động đối xứng thực tế trên dữ liệu đó. Vì vậy, một thuật toán có thể được sắp xếp lại để có tình huống đầu tiên (được gọi là nhận biết bộ đệm ) sẽ nhanh hơn nhiều so với thuật toán không thể thực hiện được. (Đây là trường hợp của thuật toán Strassen chẳng hạn.)

Ngoài ra, sự ổn định về số ít nhất cũng quan trọng như hiệu suất; và ở đây, một lần nữa, cách tiếp cận tiêu chuẩn thường chiến thắng.

O(n3)O(n2.x)


A1bAx=bnumpy.linalg.solvexAA1A


Câu trả lời tuyệt vời, cảm ơn ngài, đặc biệt là đã chỉ ra ma quỷ trong các chi tiết (hằng số trong ký hiệu O lớn) tạo ra sự khác biệt lớn giữa tốc độ lý thuyết và tốc độ thực tế.
gabious

Tôi nghĩ rằng phần "nghịch đảo hiếm khi cần thiết" nên được nhấn mạnh hơn. Nếu mục đích là để giải một hệ phương trình vi phân, có vẻ như không cần phải có một nghịch đảo hoàn toàn.
Jared Goguen

@o_o Vâng, đó là nhận xét ban đầu đầu tiên của tôi (mà tôi đã xóa sau khi hợp nhất tất cả chúng thành một câu trả lời). Nhưng tôi nghĩ, vì lợi ích của trang web (và những người đọc sau này), một câu trả lời nên trả lời câu hỏi thực tế trong câu hỏi (cả hợp lý và theo chủ đề), ngay cả khi có vấn đề XY đằng sau nó. Ngoài ra, tôi không muốn nghe quá cảnh cáo ...
Christian Clason

1
n

1
A

4

Có lẽ bạn nên lưu ý rằng, chôn sâu bên trong mã nguồn numpy (xem https://github.com/numpy/numpy/blob/master/numpy/linalg/umath_linalg.c.src ) thói quen inv cố gắng gọi hàm dgetrf từ gói LAPACK hệ thống của bạn, sau đó thực hiện phân tách LU của ma trận gốc của bạn. Điều này tương đương về mặt đạo đức với việc loại bỏ Gaussian, nhưng có thể được điều chỉnh với độ phức tạp thấp hơn một chút bằng cách sử dụng thuật toán nhân ma trận nhanh hơn trong BLAS hiệu suất cao.

Nếu bạn đi theo lộ trình này, bạn sẽ được cảnh báo rằng việc buộc toàn bộ chuỗi thư viện sử dụng thư viện mới thay vì hệ thống đi kèm với bản phân phối của bạn khá phức tạp. Một cách khác trên các hệ thống máy tính hiện đại là xem xét các phương thức song song bằng cách sử dụng các gói như scaLAPACK hoặc (trong thế giới python) petc4py. Tuy nhiên, những thứ này thường được sử dụng làm bộ giải lặp cho các hệ đại số tuyến tính hơn là áp dụng cho các phương pháp trực tiếp và PETSc nói riêng nhắm vào các hệ thống thưa thớt hơn các hệ thống dày đặc.

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.