Гарантируется, что R имеет нулевое собственное значение, а требуемое решение кратно собственному вектору, соответствующему этому собственному значению. Давайте создадим некоторую матрицу R первого:
>> R = triu(rand(3, 3));
>> R(3, 3) = 0;
>> R
R =
0.8147 0.9134 0.2785
0 0.6324 0.5469
0 0 0
Теперь давайте собственные значения и собственные векторы:
>> [V, E] = eig(R)
V =
1.0000 -0.9806 0.4289
0 0.1958 -0.5909
0 0 0.6833
E =
0.8147 0 0
0 0.6324 0
0 0 0
собственные векторы диагональные элементы Е
>> E = diag(E);
>> index = find(abs(E) < 1e-16); %// NB don't use find(E==0) because of fp problems...
Теперь вытащить правильный собственный вектор
>> v = V(:, index);
и убедитесь, что его последний элемент равен 1
>> v = v/v(end)
v =
0.6277
-0.8648
1.0000
Вы можете проверить, что это решение, которое вы хотите
>> R * v
ans =
0
0
0
Я попробовал ваш пример с triu (рандов (6,6)) и определил последние 3 диагональных элемента на 0 (R (4,4) = 0, R (5,5) = 0. R (6,6) = 0), и ваше решение не работает там. – fYpsE
Это потому, что вы спросили меня о решении, где последняя диагональная запись R (6,6) равна нулю. Нет причин, по которым он также должен работать, когда имеется более одной нулевой диагональной записи. –