80 lines
2.0 KiB
Mathematica
80 lines
2.0 KiB
Mathematica
|
|
function y = kron(X,Y)
|
||
|
|
%KRON (overloaded)
|
||
|
|
|
||
|
|
if isequal(X,1)
|
||
|
|
y = Y;
|
||
|
|
return;
|
||
|
|
end
|
||
|
|
|
||
|
|
if isequal(Y,1);
|
||
|
|
y = X;
|
||
|
|
end
|
||
|
|
|
||
|
|
if (isa(X,'sdpvar') & isa(Y,'sdpvar'))
|
||
|
|
y = [];
|
||
|
|
s.type = '()';
|
||
|
|
for i = 1:size(X,1)
|
||
|
|
this_row = [];
|
||
|
|
for j = 1:size(X,2);
|
||
|
|
s.subs = {i,j};
|
||
|
|
this_row = [this_row subsref(X,s)*Y];
|
||
|
|
end
|
||
|
|
y = [y;this_row];
|
||
|
|
end
|
||
|
|
y = flush(y);
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if isa(X,'sdpvar')
|
||
|
|
lmi_variables = getvariables(X);
|
||
|
|
nv = length(lmi_variables);
|
||
|
|
y = X;
|
||
|
|
sparse_Y = sparse(Y);
|
||
|
|
% This one used also for checking size
|
||
|
|
temp = kron(getbasematrix(X,0),sparse_Y);
|
||
|
|
if size(Y,2)==1
|
||
|
|
% Special case
|
||
|
|
% [kron([N1(:) N2(:)],vec(M))]=[vec(kron(N1,M)) vec(kron(N2,M))]
|
||
|
|
y.basis = kron(X.basis,sparse_Y);
|
||
|
|
else
|
||
|
|
y.basis=temp(:);
|
||
|
|
X_base = X.basis;
|
||
|
|
for i = 1:nv
|
||
|
|
% temp = kron(getbasematrix(X,lmi_variables(i)),sparse_Y);
|
||
|
|
temp = kron(reshape(X_base(:,i+1),X.dim),sparse_Y);
|
||
|
|
y.basis(:,i+1) = temp(:);
|
||
|
|
end;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isa(Y,'sdpvar')
|
||
|
|
lmi_variables = getvariables(Y);
|
||
|
|
nv = length(lmi_variables);
|
||
|
|
y = Y;
|
||
|
|
sparse_X = sparse(X);
|
||
|
|
% This one used also for checking size
|
||
|
|
temp = kron(sparse_X,getbasematrix(Y,0));
|
||
|
|
if size(X,1)==1
|
||
|
|
% In this special case
|
||
|
|
%[kron(vec(M),[N1(:) N2(:)])]==[vec(kron(M,N1)) vec(kron(M,N2))]
|
||
|
|
y.basis = kron(sparse_X(:),Y.basis);
|
||
|
|
else
|
||
|
|
y.basis = temp(:);
|
||
|
|
y.basis = spalloc(length(temp(:)),nv+1,0);
|
||
|
|
y.basis(:,1) = temp(:);
|
||
|
|
Y_base = Y.basis;
|
||
|
|
for i = 1:nv
|
||
|
|
% temp = kron(sparse_X,getbasematrix(Y,lmi_variables(i)));
|
||
|
|
temp = kron(sparse_X,reshape(Y_base(:,i+1),Y.dim));
|
||
|
|
y.basis(:,i+1) = temp(:);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
y.dim(1) = size(temp,1);
|
||
|
|
y.dim(2) = size(temp,2);
|
||
|
|
y = clean(y);
|
||
|
|
% Reset info about conic terms
|
||
|
|
if isa(y,'sdpvar')
|
||
|
|
y = flush(y);
|
||
|
|
y.conicinfo = [0 0];
|
||
|
|
end
|