Нет необходимости выполнять повторные вычисления, если вы можете позволить ОДНО вычисление нулевого пространства. Достаточно всего одного вызова на ноль. Для нового вектора V, если скалярное произведение с V и базисом нулевого пространства не равно нулю, то V увеличит ранг матрицы. Например, предположим, что у нас есть матрица M, которая, конечно, имеет ранг 2.
M = [1 1;2 2;3 1;4 2];
nullM = null(M')';
Будет ли новый вектор-столбец [1; 1; 1; 1] увеличивать ранг, если мы добавим его к M?
nullM*[1;1;1;1]
ans =
-0.0321573705742971
-0.602164651199413
Да, поскольку он имеет ненулевую проекцию, по крайней мере, на один из базисных векторов в nullM.
Как насчет этого вектора:
nullM*[0;0;1;1]
ans =
1.11022302462516e-16
2.22044604925031e-16
В этом случае оба числа по существу равны нулю, поэтому рассматриваемый вектор не увеличил бы ранг M.
Суть в том, что необходимо только простое умножение матрицы на вектор после генерации нулевого пространства. Если ваша матрица слишком велика (и матрица почти полного ранга), что при вызове null здесь произойдет сбой, вам потребуется проделать дополнительную работу. Однако n = 4096 не слишком велико, если в матрице не слишком много столбцов.
Одной из альтернатив, если null слишком много, является вызов svds, чтобы найти те сингулярные векторы, которые по существу равны нулю. Они сформируют базу пустого пространства, которая нам нужна.