No hay necesidad de hacer solucio- nes repetidas SI puede permitirse hacer UN cálculo del espacio nulo. Solo una llamada a null será suficiente. Dado un nuevo vector V, si el producto escalar con V y la base de espacio nulo no es cero, entonces V aumentará el rango de la matriz. Por ejemplo, supongamos que tenemos la matriz M, que por supuesto tiene un rango de 2.
M = [1 1;2 2;3 1;4 2];
nullM = null(M')';
Será un nuevo vector de columna [1; 1; 1; 1] aumentar el rango si anexó a M?
nullM*[1;1;1;1]
ans =
-0.0321573705742971
-0.602164651199413
Sí, ya que tiene un no-cero proyección sobre al menos uno de los vectores de la base en nullM.
¿Qué hay de este vector:
nullM*[0;0;1;1]
ans =
1.11022302462516e-16
2.22044604925031e-16
En este caso, ambos números son esencialmente cero, por lo que el vector en cuestión no habría aumentado el rango de M.
El punto es, sólo la multiplicación simple matriz-vector es necesaria una vez que se ha generado la base del espacio nulo. Si su matriz es demasiado grande (y la matriz casi de rango completo) que una llamada a nulo fallará aquí, entonces tendrá que hacer más trabajo. Sin embargo, n = 4096 no es excesivamente grande siempre que la matriz no tenga demasiadas columnas.
Una alternativa si null es demasiado es una llamada a svds, para encontrar esos vectores singulares que son esencialmente cero. Estos formarán la base de espacio nulo que necesitamos.
Dice que necesita hacer esto 10k veces. ¿Qué cambia de ejecución a ejecución? P.ej. ¿'A' es siempre el mismo y se compara con muchos vectores' v'? ¿O son 'A' y' v' diferentes para cada ejecución? –
@FlorianBrucker Empiezo con A teniendo relativamente pocas columnas, y luego tengo un bucle que se ejecuta ~ 20K veces, cada vez generando una nueva v de alguna manera específica, comprobando si es linealmente independiente del espacio de columna de A, y si es así, añádalo a A. –
La solución más rápida puede ser usar el espacio nulo como una restricción para crear nuevos vectores 'v'. – Jonas