From bug-request at octave dot org Fri Nov 25 22:11:47 2005 Subject: blkdiag.m (now as plaintext attachment) From: William Poetra Yoga Hadisoeseno To: bug at octave dot org Date: Sat, 26 Nov 2005 12:10:38 +0800 ------=_Part_936_10889470.1132978238307 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline I've fixed a test case, and now it's sent as a plaintext attachment ;) -- William Poetra Yoga Hadisoeseno ------=_Part_936_10889470.1132978238307 Content-Type: text/plain; name=blkdiag.diff.txt; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="blkdiag.diff.txt" Index: ChangeLog =================================================================== RCS file: /cvs/octave/scripts/ChangeLog,v retrieving revision 1.467 diff -u -r1.467 ChangeLog --- a/ChangeLog 23 Nov 2005 03:55:08 -0000 1.467 +++ b/ChangeLog 26 Nov 2005 02:19:18 -0000 at @ -1,3 +1,8 @@ +2005-11-23 William Poetra Yoga Hadisoeseno + + * general/blkdiag.m: Import from octave-forge. + Ignore empty matrices in the input. Add tests. + 2005-11-22 John W. Eaton * plot/axis.m: Use %.16g instead of just %g to format ranges for Index: general/blkdiag.m =================================================================== RCS file: general/blkdiag.m diff -N general/blkdiag.m --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ b/general/blkdiag.m 26 Nov 2005 02:19:18 -0000 at @ -0,0 +1,71 @@ +## Copyright (C) 2000 Daniel Calvelo +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## at deftypefn {Function File} {} blkdiag (@var{a}, @var{b}, @var{c}, ...) +## Build a block diagonal matrix from at var{a}, @var{b}, @var{c}, ... . +## All the arguments must be numeric and are two-dimensional matrices or +## scalars. +## at end deftypefn +## +## at seealso{diag, horzcat, vertcat} + +## Author: Daniel Calvelo +## Modified by: William Poetra Yoga Hadisoeseno + +function retval = blkdiag (varargin) + + if (nargin < 1) + usage ("blkdiag (a, b, c, ...)"); + endif + + # isnumeric is not an option for cellfun + if (! all (cell2mat (cellfun ( at isnumeric, varargin)))) + error ("all of the arguments to blkdiag must be numeric"); + endif + + # ndims is, so it's used here for speed + # note: trailing singletons are automatically (correctly) ignored + if (! all (cellfun ("ndims", varargin) == 2)) + error ("all of the arguments to blkdiag must be two-dimensional matrices"); + endif + + # ignore empty matrices + notempty = ! cellfun ("isempty", varargin); + varargin = varargin(notempty); + + # size is, but it's a bit different from calling size directly + csz = cumsum ([0 0; (cell2mat (cellfun ( at size, varargin')))], 1); + retval = zeros (csz(end,:)); + for p = 1:(length (notempty(notempty))) + retval((csz(p,1)+1):csz(p+1,1),(csz(p,2)+1):csz(p+1,2)) = varargin{p}; + endfor + +endfunction + +# regular tests +%!assert(blkdiag(1,ones(2),1),[1,0,0,0;0,1,1,0;0,1,1,0;0,0,0,1]) +%!assert(blkdiag([1,2],[3,4],[5,6]),[1,2,0,0,0,0;0,0,3,4,0,0;0,0,0,0,5,6]) +%!assert(blkdiag([1,2],[3;4],[5,6]),[1,2,0,0,0;0,0,3,0,0;0,0,4,0,0;0,0,0,5,6]) +%!assert(blkdiag([1,2;3,4],[5,6,7]),[1,2,0,0,0;3,4,0,0,0;0,0,5,6,7]) +# tests involving empty matrices +%!assert(blkdiag([],[],[]),[]) +%!assert(blkdiag([],[1,2;3,4],[],5,[]),[1,2,0;3,4,0;0,0,5]) +%!assert(blkdiag(zeros(1,0,1),[1,2,3],1,0,5,zeros(0,1,1)),[1,2,3,0,0,0;0,0,0,1,0,0;0,0,0,0,0,0;0,0,0,0,0,5]); +# sanity checks +%!test +%! A = rand (round (rand (1, 2) * 10)); +%! assert (blkdiag (A), A); ------=_Part_936_10889470.1132978238307-- ------------------------------------------------------------- Octave is freely available under the terms of the GNU GPL. Octave's home on the web: http://www.octave.org How to fund new projects: http://www.octave.org/funding.html Subscription information: http://www.octave.org/archive.html -------------------------------------------------------------