Kiểm tra nếu hai ma trận 12x12 có cùng định thức


11

12×12QJ

det(Q)=det(12IQJ)(1)
J

Tôi hiện đang làm điều này với thư viện armadillo nhưng hóa ra quá chậm. Vấn đề là tôi cần phải làm điều này cho hàng nghìn tỷ ma trận và hóa ra việc tính toán hai yếu tố quyết định là nút cổ chai trong chương trình của tôi. Do đó tôi có hai câu hỏi

  1. Có mẹo nào tôi có thể sử dụng để tính toán định thức nhanh hơn mà tôi biết kích thước của chúng không? Có lẽ là một bản mở rộng lộn xộn cho ma trận 12×12 có thể hoạt động trong trường hợp này?

  2. Có cách nào hiệu quả khác để kiểm tra đẳng thức (1)

Biên tập. Để trả lời các ý kiến. Tôi cần tính toán tất cả các đồ thị không tự bổ sung G được kết nối Gtheo thứ tự 13 sao cho GG¯ có cùng số lượng cây bao trùm. Động lực cho điều này có thể được tìm thấy trong bài viết dòng chảy toán học này . Đối với máy tôi đang chạy song song trên máy 8 nhân 3,4GHh.

Biên tập. Tôi đã có thể giảm 50% thời gian chạy dự kiến ​​bằng cách tạo một chương trình C để tính toán cụ thể định thức của ma trận 12×12 . Gợi ý vẫn được chào đón.


6
Làm thế nào chậm là quá chậm? Mất bao lâu trên phần cứng? Là hàng nghìn tỷ của các này độc lập để bạn có thể tính toán nhiều yếu tố quyết định này song song? Nếu vậy, bạn có thể chạy trên một máy lớn như thế nào? Điều gì dẫn đến vấn đề này? Bạn có chắc chắn cần tính toán các yếu tố quyết định? Q
Bill Barth

3
Làm thế nào thường xuyên (đối với phần nhỏ của các trường hợp) là các yếu tố quyết định giống nhau / khác nhau? Nếu chúng khác nhau hầu hết thời gian, có thể có một thử nghiệm rẻ hơn để xác định rằng chúng có thể khác nhau và bạn sẽ xác minh rằng chúng giống nhau chỉ khi thử nghiệm đầu tiên thất bại. Cách khác nếu chúng giống nhau hầu hết thời gian.
Wolfgang Bangerth

1
Như đã hỏi: bạn có thể cung cấp một số chi tiết về nơi đến từ đâu không? Có lẽ có một cách tiếp cận tốt hơn so với các yếu tố quyết định tính toán mù quáng. Q
JM

4
Quan niệm rằng điều kiện này phải được kiểm tra "cho một nghìn tỷ ma trận" gợi ý 1) rằng được biết là apriori có một số cấu trúc đặc biệt (nếu không thì kỳ vọng rằng điều kiện này ngẫu nhiên là nhẹ) và 2) rằng cách tiếp cận tốt hơn có thể là đặc trưng cho tất cả các ma trận với thuộc tính này (với công thức có thể kiểm tra hiệu quả). QQQ
hardmath

1
@hardmath Có, là một ma trận số nguyên có các mục chéo nằm trong khoảng từ đến và dưới dạng các phần tử đường chéo1 12 - 1Q1121
Jernej

Câu trả lời:


8

Vì bạn đã sử dụng C ++ và ma trận của bạn là xác định dương đối xứng, nên tôi sẽ thực hiện hệ số xoay vòng của và cả . Ở đây tôi giả sử rằng cũng có giá trị xác định dương, nếu không, sẽ yêu cầu xoay vòng để ổn định số (cũng có thể mặc dù nó không xác định dương, nhưng không cần phải xoay vòng, nhưng bạn phải thử). Q 12 I - Q - J 12 I - Q - J L D L TLDLTQ12IQJ12IQJLDLT

Tốc độ này nhanh hơn hệ số LU và cũng nhanh hơn Cholesky vì tránh căn bậc hai. Yếu tố quyết định chỉ đơn giản là tích của các phần tử của ma trận chéo . Mã để thực hiện nhân tố LDL rất đơn giản, bạn có thể viết nó dưới 50 dòng C. Trang Wikipedia trên đó mô tả thuật toán và tôi có một số mã templated đơn giản để thực hiện Cholesky ở đây . Bạn bao la có thể đơn giản hóa đó và sửa đổi nó để tránh những căn bậc hai để thực hiện các thừa.L D L TDLDLT

Vì bạn cũng có thể kiểm soát định dạng lưu trữ, bạn có thể tối ưu hóa thêm thói quen để chỉ lưu một nửa ma trận và đóng gói thành một mảng tuyến tính để tối đa hóa vị trí bộ nhớ. Tôi cũng sẽ viết các sản phẩm chấm tùy chỉnh đơn giản và các thói quen cập nhật xếp hạng 1 vì kích thước sự cố quá nhỏ, bạn nên để trình biên dịch nội tuyến các thói quen để giảm chi phí cuộc gọi. Vì đó là một vòng lặp có kích thước cố định, trình biên dịch sẽ có thể tự động nội tuyến và hủy đăng ký mọi thứ khi thích hợp.

Tôi sẽ tránh cố gắng chơi các thủ thuật để lợi dụng thực tế là có chứa bên trong biểu thức. Có khả năng là đối với các kích thước vấn đề nhỏ như vậy, các thủ thuật này cuối cùng sẽ chậm hơn so với việc thực hiện hai phép tính xác định riêng biệt. Tất nhiên, cách duy nhất để xác minh những tuyên bố này là thử nó.Q12IQJQ


1
Tôi thứ hai khuyến nghị thực hiện , hay còn gọi là Cholesky không có root, vì Armadillo dường như không có cách nào để tận dụng sự thống trị tích cực / dứt khoát của đường chéo. LDLT
hardmath

5

Không có một số thông tin về việc xây dựng ma trận đối xứng thực xác định , các đề xuất được đưa ra là rất cần thiết khá hạn chế.12×12

Tôi đã tải xuống gói Armadillo từ Sourceforge và xem tài liệu này. Cố gắng cải thiện hiệu suất của tính toán riêng biệt và , trong đó là ma trận xếp hạng một của tất cả các ma trận, bằng cách đặt ví dụ . Tài liệu lưu ý rằng đây là mặc định cho ma trận có kích thước , do đó, tôi cho rằng tùy chọn này là mặc định cho trường hợp .det(Q)det(12IQJ)Jdet(Q,slow=false)4×4slow=true12×12

Những gì slow=true có lẽ làm là xoay vòng một phần hoặc toàn bộ trong việc có được một hình thức phản hồi hàng, từ đó dễ dàng tìm thấy định thức. Tuy nhiên, bạn biết trước ma trận là xác định dương, do đó, việc xoay vòng là không cần thiết cho sự ổn định (ít nhất là đối với phần lớn các tính toán của bạn. Không rõ gói Armadillo có ném ngoại lệ hay không nếu pivots trở nên quá nhỏ, nhưng điều này sẽ là một Tính năng của gói đại số tuyến tính số hợp lý. EDIT: Tôi tìm thấy mã Armadillo thực hiện trong tệp tiêu đề , sử dụng các mẫu C ++ cho chức năng quan trọng. Cài đặt dường như không ảnh hưởng đến cáchQdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×12yếu tố quyết định sẽ được thực hiện bởi vì tính toán được "ném qua tường" thành LAPACK (hoặc ATLAS) tại thời điểm đó mà không có dấu hiệu cho thấy không cần phải xoay vòng; xem det_lapackvà các yêu cầu của nó trong tập tin đó.

Điểm khác là tuân theo khuyến nghị của họ về việc xây dựng gói Armadillo liên kết với các thay thế tốc độ cao cho BLAS và LAPACK, nếu bạn thực sự đang sử dụng các gói đó; xem phần 5 tệp Armadillo README.TXT để biết chi tiết. [Việc sử dụng phiên bản BLAS hoặc LAPACK 64 bit chuyên dụng cũng được khuyến nghị cho tốc độ trên các máy 64 bit hiện tại.]

Giảm hàng thành dạng hồi âm về cơ bản là loại bỏ Gaussian và có độ phức tạp số học . Đối với cả hai ma trận, số này sau đó lên tới hai lần hoạt động hoặc . Các hoạt động này có thể là "nút cổ chai" trong quá trình xử lý của bạn, nhưng có rất ít hy vọng rằng nếu không có cấu trúc đặc biệt trong (hoặc một số mối quan hệ đã biết trong số các trường hợp thử nghiệm nghìn tỷ cho phép khấu hao) thì công việc có thể giảm xuống .23n3+O(n2)43n3+O(n2)QO(n2)

Để so sánh, việc mở rộng bởi các đồng yếu tố của ma trận liên quan đếnphép toán nhân (và gần như nhiều phép cộng / phép trừ), do đó, đối với phép so sánh ( so với ) rõ ràng ủng hộ việc loại bỏ các cofactors.n×nn!n=1212!=47900160023n3=1152

Một cách tiếp cận khác yêu cầu công việc sẽ giảm thành dạng tridia chéo với các phép biến đổi Householder, cũng đưa thành dạng tridia chéo. Việc tính toán và sau đó có thể được thực hiện trong các hoạt động . [Hiệu ứng của bản cập nhật cấp một trong định thức thứ hai có thể được biểu thị dưới dạng một yếu tố vô hướng được đưa ra bằng cách giải quyết một hệ thống ba cực.]43n3+O(n2)Q12IQdet(Q)det(12IQJ)O(n)J

Việc thực hiện một tính toán độc lập như vậy có thể đáng giá như một kiểm tra về kết quả của các cuộc gọi thành công (hoặc thất bại) đến detchức năng của Armadillo .

Trường hợp đặc biệt: Theo đề xuất của một bình luận của Jernej, giả sử rằng trong đó như trước là ma trận (hạng 1) của tất cả những người và là một ma trận đường chéo không tích cực (dương). Thật vậy, đối với ứng dụng được đề xuất trong lý thuyết đồ thị, đây sẽ là các ma trận nguyên. Sau đó, một công thức rõ ràng cho là:Q=DJJD=diag(d1,,dn)det(Q)

det(Q)=(i=1ndi)(1i=1ndi1)

Một bản phác thảo bằng chứng của nó tạo cơ hội để minh họa khả năng ứng dụng rộng hơn, tức là bất cứ khi nào có một định thức đã biết và hệ thống nhanh chóng được giải quyết. Bắt đầu bằng cách bao thanh toán:DDv=(11)T

det(DJ)=det(D)det(ID1J)

Bây giờ lại xếp hạng 1, cụ thể là . Lưu ý rằng yếu tố quyết định thứ hai chỉ đơn giản là:D1J(d11dn1)T(11)

f(1)=det(ID1J)

nơi là đa thức đặc trưng của . Là ma trận hạng 1, phải có (ít nhất) số của để tính đến khoảng trống của nó. Giá trị riêng "thiếu" là , như có thể thấy từ tính toán:f(x)D1Jf(x)n1xdi1

D1J(d11dn1)T=(di1)(d11dn1)T

Theo sau đó là đa thức đặc trưng và như được hiển thị ở trên cho , .f(1)det(I-D-1J)1-Σd - 1 if(x)=xn1(xdi1)f(1)det(ID1J)1di1

Cũng lưu ý rằng nếu , thì , một ma trận đường chéo có xác định đơn giản là sản phẩm của các mục chéo.12 I - Q - J = 12 I - D + J - J = 12 I - DQ=DJ12IQJ=12ID+JJ=12ID


Hừm .. thực tế là trong đó là ma trận kề của nên tôi nghĩ rằng kết quả này có thể không đúng. Cụ thể, điều đó có nghĩa là số lượng cây bao trùm của đồ thị được xác định bởi trình tự mức độ không giữ được. D - AQDAAGG
Jernej

Các mục ngoài đường chéo của sau đó thường chứa 0 cũng như -1. Các phân hủy được đề xuất bởi Victor mất lợi thế của tính đối xứng và giảm hạn hàng đầu trong đếm hoạt động từ để . Có một cách tiếp cận số nguyên chính xác, nhưng có lẽ không cần thiết cho ma trận kích thước khiêm tốn và các mục nhập của bạn. Nếu tôi hiểu việc xây dựng, là xác định dương với cùng lý do là. QLDLT23n313n312IQJQ
hardmath

@Jernej: Nếu bạn tin rằng điều gì đó tôi đã nêu là không chính xác, tôi đã tạo một phòng trò chuyện dựa trên Câu hỏi này , nơi cuộc thảo luận có thể được xâu chuỗi mà không cần bình luận không cần thiết ở đây.
hardmath

1

Nếu bạn có một cách có cấu trúc để liệt kê các biểu đồ bạn muốn tính toán các yếu tố quyết định, có lẽ bạn có thể tìm thấy các bản cập nhật thứ hạng thấp chuyển bạn từ biểu đồ này sang biểu đồ khác.

Nếu vậy, thì bạn có thể sử dụng bổ đề xác định ma trận để tính toán giá trị xác định của biểu đồ tiếp theo được liệt kê bằng cách sử dụng kiến ​​thức của bạn về biểu thức xác định hiện tại.

Nghĩa là, đối với ma trận và vectơ : Điều này có thể được khái quát nếu U và V ma trận và là : Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

Để tính toán nghịch đảo một cách hiệu quả, bạn có thể sử dụng công thức Sherman-Morrison để thu được nghịch đảo của ma trận tiếp theo từ ma trận hiện tại:

(A+uvT)1=A1A1uvTA11+vTA1u

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.