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

📄 blockdiag.m

📁 计量工具箱
💻 M
字号:
function M=blockdiag(varargin)% PURPOSE: Construct a block-diagonal matrix with the inputs on the diagonals.% e.g. blockdiag(a,b,c) generates [a 0 0;0 b 0;0 0 c] where the zero-matrices are%      of appropiate size. %------------------------------------------------------------------------% USAGE: M = blockdiag(varargin)%% The function accepts arbitrary number of arguments, where% each matrix can have an arbitrary size (and even arbitrary number% of dimensions).%------------------------------------------------------------------------% RETURNS: M = [a 0 0;0 b 0;0 0 c] where the zero-matrices are%                                  of appropiate size. %------------------------------------------------------------------------% Written by:Hans.Olsson@dna.lth.se 1997-10-10%            Department of Computer Science%            Lund University in Sweden.% HOW MANY DIMENSIONS?% ----- Start of code for arbitrary number of dimensions.ndtab=zeros(nargin,1);for i=1:nargin,  ndtab(i)=ndims(varargin{i});end;% Maximum number of dimensions.ndmax=max(ndtab);% ----- End of arbitrary number of dimensions code.% Replace with 'ndmax=2;' for a few extra percent of speed increase.% FIND SIZES OF INPUTS.si=ones(nargin,ndmax); % Using ones guarantees that trailing matrix dimension have size 1.for i=1:nargin  si(i,1:ndtab(i))=size(varargin{i});end;  % FILL IN ZEROS IN OUTPUT.M=zeros(sum(si,1)); % Note the 1. Plain 'sum(si)' would fail if only one input to blockdiag.  % FILL IN BLOCKDIAGONALS.start=zeros(1,ndmax);if (ndmax==2)  % Special case for 2-dimensional matrices.  for i=1:nargin    M(start(1)+(1:si(i,1)),start(2)+(1:si(i,2)))=varargin{i};    start=start+si(i,:);  end;else  % ----- Start of code for arbitrary number of dimensions.  % The general case of n-dimensional matrices.  % Basically only included for the fun of it.  index={};  for i=1:nargin    for j=1:ndmax      % index for dimension j:      index{j}=start(j)+(1:si(i,j));    end;    % This transform the index-list into a list of arguments to M():    % Compare to the 2-dimensional case.    M(index{:})=varargin{i};    start=start+si(i,:);  end;  % ----- End of code for arbitrary number of dimensions.end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -