Подтвердить что ты не робот

Как найти, является ли матрица 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() работали, полагая, что беру значения контрольных значений, как указано ниже.

Однако что происходит, когда у меня есть два значения, близкие, но не совсем равные?

Как я могу решить, что слишком близко?

4b9b3361

Ответ 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 - верхняя треугольная матрица с тем свойством, что величина диагональных элементов уменьшается по диагонали.