52 lines
1.3 KiB
Matlab
Executable File
52 lines
1.3 KiB
Matlab
Executable File
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); |