Non è necessario eseguire soluzioni ripetute SE è possibile effettuare un calcolo dello spazio nullo. Solo una chiamata a null sarà sufficiente. Dato un nuovo vettore V, se il prodotto punto con V e base null è diverso da zero, allora V aumenterà il rango della matrice. Ad esempio, supponiamo di avere la matrice M, che ovviamente ha un rango di 2.
M = [1 1;2 2;3 1;4 2];
nullM = null(M')';
Sarà un nuovo vettore colonna [1; 1; 1; 1] aumentare il rango se allegate a M?
nullM*[1;1;1;1]
ans =
-0.0321573705742971
-0.602164651199413
Sì, poiché ha un non-zero proiezione su almeno uno dei vettori di base in nullM.
Che ne dite di questo vettore:
nullM*[0;0;1;1]
ans =
1.11022302462516e-16
2.22044604925031e-16
In questo caso, entrambi i numeri sono sostanzialmente pari a zero, in modo che il vettore in questione non avrebbe aumentato il rango di M.
Il punto è, a la moltiplicazione semplice del vettore matrice è necessaria una volta generata la base dello spazio nullo. Se la tua matrice è troppo grande (e la matrice quasi del rango completo) che una chiamata a null fallirà qui, allora dovrai fare più lavoro. Tuttavia, n = 4096 non è eccessivamente grande fintanto che la matrice non ha troppe colonne.
Un'alternativa se nulla è troppo è una chiamata a GNS, per trovare quei vettori singolari che sono essenzialmente zero. Questi formeranno la base nulla di cui abbiamo bisogno.
fonte
2012-02-01 16:12:24
Si dice che è necessario eseguire questa operazione 10 volte. Cosa cambia da correre a correre? Per esempio. è 'A' sempre uguale e controlli contro molti vettori' v'? O sono 'A' e' v' diversi per ogni corsa? –
@FlorianBrucker cominciare con la vista relativamente poche colonne, e quindi ho un ciclo che viene eseguito ~ 20K volte, ogni volta genera un nuovo v in qualche modo specifico, il controllo per vedere se linearmente indipendenti dello spazio colonna di A, e se lo è, aggiungendolo a A. –
La soluzione più veloce potrebbe essere quella di utilizzare lo spazio nullo come vincolo per la creazione di nuovi vettori 'v'. – Jonas