📄 blkdiag.m
字号:
function y = blkdiag(varargin)
%BLKDIAG (overloaded)
% Author Johan L鰂berg
% $Id: blkdiag.m,v 1.2 2004/07/01 11:17:09 johanl Exp $
if nargin<2
y=varargin{1};
return
end
% Get dimensions
n = zeros(nargin,1);
m = zeros(nargin,1);
isasdpvar = zeros(nargin,1);
Symmetric = zeros(nargin,1);
for i = 1:nargin
if isa(varargin{i},'sdpvar')
isasdpvar(i) = 1;
n(i)=varargin{i}.n;
m(i)=varargin{i}.m;
else
[n(i) m(i)] = size(varargin{i});
end
Symmetric(i)= issymmetric(varargin{i});
end
% Find all free variables used
all_lmi_variables = [];
for i = 1:nargin
all_lmi_variables = [all_lmi_variables getvariables(varargin{i})];
end
all_lmi_variables = unique(all_lmi_variables);
% Create an SDPVAR
y=sdpvar(1,1,'rect',all_lmi_variables,[]);
% Allocate a basis
basis = spalloc(sum(m)*sum(n),1+length(all_lmi_variables),0);
% Some indexation tricks
msums = cumsum([0; m]);
nsums = cumsum([0; n]);
summ=sum(m);
sumn=sum(n);
indextable = reshape(1:sumn*summ,sumn,summ);
for j = 1:nargin
nnindex = indextable(1+nsums(j):nsums(j+1),1+msums(j):msums(j+1));
if isasdpvar(j)
this_uses = find(ismembc(all_lmi_variables,varargin{j}.lmi_variables));
mindex = [1 this_uses+1];
basis(nnindex(:),mindex) = varargin{j}.basis;
else
basis(nnindex(:),1) = varargin{j}(:);
end
end
y.basis = basis;
y.n = sumn;
y.m = summ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -