📄 blockdiag.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 + -