Como descobrir se uma matriz é Singular no Matlab
Eu uso a função abaixo para gerar os betas para um determinado conjunto de guess lambdas do meu otimizador.
Ao executar, muitas vezes recebo a seguinte mensagem de aviso:
Aviso: A matriz é singular para precisão de trabalho. Em NSS_betas em 9 de dezembro em 19 em Individual_Lambdas em 36
Gostaria de poder excluir quaisquer betas que formem uma matriz singular no conjunto de soluções, no entanto não sei como testar?
Eu tenho tentado usar o rcond (), mas eu não sei onde fazer o corte entre singular e não singular?
Certamente, se o Matlab está gerando a mensagem de aviso, ele já sabe se a matriz é singular ou não, então se eu pudesse encontrar onde aquela variável estava armazenada eu poderia usar isso?
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
Obrigado pelo conselho:
Eu testei todos os três exemplos abaixo depois de definir os valores de lambda como iguais, de modo a conseguir uma matriz singular
if (~isinf(G))
r=rank(G);
r2=rcond(G);
r3=min(svd(G));
end
r = 3, r2 = 2,602085213965190e-16; r3 = 1,075949299504113e-15;
Então, neste teste, rank () e rcond () funcionaram, assumindo que eu tomei os valores de benchmark como dado abaixo.
No entanto, o que acontece quando eu tenho dois valores próximos, mas não exatamente iguais?
Como posso decidir o que está próximo demais?