Dynamic-Calibration/utils/YALMIP-master/extras/@ndsdpvar/sum.m

52 lines
1.3 KiB
Mathematica
Raw Normal View History

2019-12-18 11:25:45 +00:00
function X = sum(varargin)
% SUM (overloaded)
Y = varargin{1};
X = Y;
%X.basis = [];
if nargin == 2 && isequal(varargin{2},length(X.dim))
% smash slices
X.basis = kron(ones(1,X.dim(end)),speye(prod(X.dim(1:end-1))))*Y.basis;
X.dim = X.dim(1:end-1);
else
if nargin == 1
index = find(X.dim~=1);
if isempty(index)
index = length(X.dim);
else
index = index(1);
end
else
index = varargin{2};
end
if index > length(X.dim)
return
end
% Permute to the case which we can do fast
i = 1:length(X.dim);
p = circshift(i',length(X.dim)-(index))';
X = permute(X,p);
% Permute might have squeezed to 2 array
if length(size(X))~=length(size(Y))
% Expand back last dimension
if length(size(X))==2
X = ndsdpvar(X);
end
X.dim = [X.dim ones(1,length(size(Y))-length(size(X)))];
end
X = sum(X,length(X.dim));
if isa(X,'sdpvar')
X = ndsdpvar(X);
X.dim = [X.dim ones(1,length(size(varargin{1}))-length(size(X)))];
else
X.dim = [X.dim ones(1,length(size(varargin{1}))-length(size(X)))];
end
p = circshift((1:length(X.dim))',-(length(Y.dim)-(index)))';
X = permute(X,p);
% X.dim = Y.dim;
% X.dim(index) = 1;
end
if isa(X,'ndsdpvar')
X.conicinfo = [0 0];
end
X = clean(X);