Dynamic-Calibration/utils/YALMIP-master/extras/@ncvar/det.m

40 lines
1.0 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function d = det(X)
%DET (overloaded)
n = X.dim(1);
m = X.dim(2);
if n~=m
error('Matrix must be square.');
else
switch n
case 1
d = X;
case 2
% Freakin overloading on multiplication doesn't work. Probalby
% stupid code...
Y1.type = '()';
Y2.type = '()';
Y3.type = '()';
Y4.type = '()';
Y1.subs = {1,1};
Y2.subs = {2,2};
Y3.subs = {1,2};
Y4.subs = {2,1};
d = subsref(X,Y1)*subsref(X,Y2)-subsref(X,Y3)*subsref(X,Y4);
otherwise
d = 0;
Y.type = '()';
for i = 1:n
Y.subs = {i,1};
xi = subsref(X,Y);
if ~isequal(xi,0)
Y.subs = {[1:1:i-1 i+1:1:n],2:n};
subX = subsref(X,Y);
d = d + (-1)^(i+1)*xi*det(subX);
end
end
end
end
% Reset info about conic terms
d.conicinfo = [0 0];