⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blkdiag.m

📁 国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题
💻 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 + -