Как найти, является ли матрица Singular в Matlab
Я использую приведенную ниже функцию для создания бета для данного набора гамма-лямбда от моего оптимизатора.
При запуске я часто получаю следующее предупреждающее сообщение:
Предупреждение. Матрица отличается исключительной точностью.
В NSS_betas в 9
В DElambda в 19
В Individual_Lambdas при 36
Я хотел бы иметь возможность исключить любые бета-версии, которые образуют сингулярную матрицу из набора решений, однако я не знаю, как ее проверить?
Я пытаюсь использовать rcond(), но я не знаю, где сделать срез между сингулярным и несингулярным?
Конечно, если Matlab генерирует предупреждающее сообщение, он уже знает, является ли матрица сингулярной или нет, если бы я мог просто найти, где была сохранена эта переменная, я мог бы использовать это?
function betas=NSS_betas(lambda,data)
mats=data.mats2';
lambda=lambda;
yM=data.y2';
nObs=size(yM,1);
G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))];
betas=G\yM;
r=rcond(G);
end
Спасибо за совет:
Я проверил все три примера ниже, установив равные значения лямбда, и получив особую матрицу
if (~isinf(G))
r=rank(G);
r2=rcond(G);
r3=min(svd(G));
end
r = 3, r2 = 2,602085213965190e-16; r3 = 1.075949299504113e-15;
Итак, в этом тесте rank() и rcond() работали, полагая, что беру значения контрольных значений, как указано ниже.
Однако что происходит, когда у меня есть два значения, близкие, но не совсем равные?
Как я могу решить, что слишком близко?
Ответы
Ответ 1
rcond
- это правильный путь. Если он приближается к точности машины, равной нулю, ваша матрица является единственной. Обычно я использую:
if( rcond(A) < 1e-12 )
% This matrix doesn't look good
end
Вы можете поэкспериментировать со значением, которое соответствует вашим потребностям, но если взять обратную матрицу, которая даже близка к единице с MATLAB, это может привести к результатам мусора.
Ответ 2
Вы можете сравнить результат rank(G)
с количеством столбцов G
. Если ранг меньше размера столбца, у вас будет особая матрица.
Ответ 3
вы также можете проверить это:
min(svd(A))>eps
и проверяет, что наименьшее сингулярное значение больше, чем eps, или любой другой числовой толерант, который имеет отношение к вашим потребностям. (код вернет 1 или 0)
Здесь больше информации об этом...
Ответ 4
Условие номер (Maximal singular value/Minimal singular value)
- еще один хороший метод:
cond(A)
Использует svd
. Он должен быть как можно ближе к 1. Очень большие значения означают, что матрица почти сингулярна. Inf
означает, что он точно сингулярен.
Обратите внимание, что почти все методы, упомянутые в других ответах, используют как-то svd
:
Ответ 5
Существуют специальные инструменты, предназначенные для этой проблемы, которые называются "раскодирование матричных факторингов". К моему лучшему (хотя и немного старому) знанию, достаточно хороший способ решить, является ли матрица n x n
A
неособой, чтобы идти с
det(A) <> 0 <=> rank(A) = n
и используйте раскрывающийся ранг QR-факторизация:
AP = QR
где Q
ортогонально, P
- матрица перестановок, а R
- верхняя треугольная матрица с тем свойством, что величина диагональных элементов уменьшается по диагонали.