2012-02-01 35 views
5

Đặt ma trận n-by-m A hay không, với điều kiện đảm bảo rằng n> m = xếp hạng (A), và cho một cột n-by-1 v, cái gì là cách nhanh nhất để kiểm tra xem [A v] có xếp hạng nghiêm ngặt lớn hơn A không?Cách nhanh nhất để kiểm tra xem một véc tơ có làm tăng xếp hạng ma trận

Đối với đơn đăng ký của tôi, A thưa thớt, n là khoảng 2^12 và m là bất kỳ vị trí nào trong 1: n-1. So sánh xếp hạng (đầy đủ ([A v])) mất khoảng một giây trên máy tính của tôi, và tôi cần phải làm điều đó hàng chục nghìn lần, vì vậy tôi sẽ rất vui khi khám phá ra một cách nhanh hơn.

+0

Bạn nói bạn cần thực hiện 10k lần này. Những gì thay đổi từ chạy để chạy? Ví dụ. là 'A' luôn giống nhau và bạn kiểm tra nhiều vectơ' v'? Hoặc là 'A' và' v' khác nhau cho mỗi lần chạy? –

+0

@FlorianBrucker Tôi bắt đầu với A có ít cột tương đối, và sau đó tôi có một vòng lặp chạy ~ 20K lần, mỗi lần tạo một v mới theo một cách cụ thể nào đó, kiểm tra xem nó có độc lập tuyến tính với không gian cột của A hay không nếu có, hãy thêm nó vào A. –

+1

Giải pháp nhanh nhất có thể là sử dụng không gian trống như một ràng buộc để tạo vectơ mới 'v'. – Jonas

Trả lời

1

Có thể bạn có thể thử giải quyết hệ thống A*x=v, nếu nó có giải pháp có nghĩa là thứ hạng không tăng.

x=(B\A)'; 
norm(A*x-B) %% if this is small then the rank does not increase 
+0

Đề xuất tốt, nhưng có vẻ tốn nhiều thời gian hơn so với xếp hạng cuộc gọi ([full (A) v]) với các trường hợp thử nghiệm của tôi - khoảng 4 giây so với 1 giây. –

6

Không cần phải thực hiện các giải pháp lặp lại NẾU bạn có thể đủ khả năng để thực hiện MỘT phép tính khoảng trống. Chỉ cần một cuộc gọi đến null là đủ. Với một vectơ V mới, nếu sản phẩm dấu chấm có V và cơ số null không khác 0 thì V sẽ tăng thứ hạng của ma trận. Ví dụ, giả sử chúng ta có M ma trận, trong đó tất nhiên có một cấp bậc 2.

M = [1 1;2 2;3 1;4 2]; 
nullM = null(M')'; 

sẽ một vector cột mới [1; 1; 1; 1] tăng thứ hạng nếu chúng ta nối nó đến M?

nullM*[1;1;1;1] 
ans = 
     -0.0321573705742971 
     -0.602164651199413 

Có, vì nó có phép chiếu khác trên ít nhất một trong các vectơ cơ sở trong nullM.

Làm thế nào về vector này:

nullM*[0;0;1;1] 
ans = 
     1.11022302462516e-16 
     2.22044604925031e-16 

Trong trường hợp này, cả hai con số cơ bản là bằng không, vì vậy các vector trong câu hỏi sẽ không có tăng thứ hạng của M.

Vấn đề là, chỉ có một Phép nhân-vector đơn giản là cần thiết khi cơ sở không gian rỗng đã được tạo ra. Nếu ma trận của bạn là quá lớn (và ma trận gần như đầy đủ thứ hạng) rằng một cuộc gọi đến null sẽ thất bại ở đây, sau đó bạn sẽ cần phải làm việc nhiều hơn nữa. Tuy nhiên, n = 4096 không quá lớn miễn là ma trận không có quá nhiều cột.

Một giải pháp thay thế nếu null quá nhiều là cuộc gọi đến svd, để tìm những véc tơ số ít về cơ bản là không. Chúng sẽ tạo thành cơ sở nullspace mà chúng ta cần.

+0

Cảm ơn! Đó là những gì tôi đã cố gắng, ngoại trừ việc LinAlg-fu của tôi không mạnh như bạn. – Jonas

+0

Cảm ơn, đây là lời khuyên rất tốt cho các giải pháp lặp đi lặp lại. –

2

Tôi sẽ sử dụng sprank cho ma trận thưa thớt. Kiểm tra nó ra, nó có thể nhanh hơn bất kỳ phương pháp nào khác.

Chỉnh sửa: Như được chỉ ra một cách chính xác bởi @IanHincks, nó không phải là thứ hạng. Tôi để lại câu trả lời ở đây, chỉ trong trường hợp người khác sẽ cần nó trong tương lai.

+1

Nó chắc chắn nhanh hơn nhiều, nhưng nó không trả lại thứ hạng, chỉ bị ràng buộc trên cấp bậc (tài liệu gọi nó là cấp bậc cấu trúc). –

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