Dynamic-Calibration/utils/YALMIP-master/extras/blockdiagmoment.m

75 lines
2.0 KiB
Matlab
Executable File

function M = blockdiagmoment(obj,M)
rt = [];
r_old = [];
go_on = 1;
while go_on
exponent_p = getexponentbase(obj+sum(sum(rt)),recover(depends(obj)));
Msparsity = zeros(size(M{end},1));
vars = recover(depends(obj));
for i = 1:size(M{end},1)
for j = i:size(M{end},1)
exponent_Mij = getexponentbase(M{end}(i,j),vars);
if ~isempty(findrows(exponent_p,exponent_Mij)) & sum(exponent_Mij)~=0
Msparsity(i,j) = 1;
Msparsity(j,i) = 1;
end
end
end
[p,q,r,s] = dmperm(Msparsity+eye(length(Msparsity)));
if isequal(r,r_old)
go_on = 0;
else
Mblocked = [];
Mrs = M{end}(p,p);
MM = ones(length(M{end}));
blocks = zeros(1,length(M{end}));
Ms = Msparsity(p,p);
for i = 1:length(r)-1
blocks(r(i+1)-r(i)) = blocks(r(i+1)-r(i)) + 1;
Mtest = Ms(r(i):(r(i+1)-1),r(i):(r(i+1)-1));
if nnz(Mtest)==0
else
MM = blkdiag(MM,ones(r(i+1)-r(i)));
Mblocked = blkdiag(Mblocked,Mrs(r(i):(r(i+1)-1),r(i):(r(i+1)-1)));
end
end
string = 'Blocks : ';
for i = 1:length(blocks)
if blocks(i)>0
string = [string num2str(i) 'x' num2str(i) '(' num2str(blocks(i)) ') ' ];
end
end
disp(string)
rt = Mblocked(:);
r_old = r;
end
end
M{end} = Mblocked;
%
% mt = yalmip('monomtable');
% hash = randn(size(mt,2),1);
% for i = 1:length(u{end})
% for j = 1:length(u{end})
% if i==1
% v1 = zeros(1,size(mt,2));
% else
% vi = getvariables(u{end}(i));
% v1 = mt(vi,:);
% end
% if j==1
% v2 = zeros(1,size(mt,2));
% else
% vj = getvariables(u{end}(j));
% v2 = mt(vj,:);
% end
% v = v1+v2;
% vh = v*hash;
% uiuj(i,j) = vh;
% end
% end