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.
Nguồn
2012-02-01 16:12:24
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? –
@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. –
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