Mercurial > octave
annotate scripts/general/blkdiag.m @ 27919:1891570abac8
update Octave Project Developers copyright for the new year
In files that have the "Octave Project Developers" copyright notice,
update for 2020.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 06 Jan 2020 22:29:51 -0500 |
parents | b442ec6dda5c |
children | bd51beb6205e |
rev | line source |
---|---|
27919
1891570abac8
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27918
diff
changeset
|
1 ## Copyright (C) 2000-2020 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
2 ## |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
3 ## See the file COPYRIGHT.md in the top-level directory of this distribution |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
4 ## or <https://octave.org/COPYRIGHT.html/>. |
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
5 ## |
5551 | 6 ## |
7016 | 7 ## This file is part of Octave. |
5551 | 8 ## |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
9 ## Octave is free software: you can redistribute it and/or modify it |
7016 | 10 ## under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
11 ## the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
12 ## (at your option) any later version. |
7016 | 13 ## |
14 ## Octave is distributed in the hope that it will be useful, but | |
15 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
16 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
17 ## GNU General Public License for more details. |
5551 | 18 ## |
19 ## You should have received a copy of the GNU General Public License | |
7016 | 20 ## along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
21 ## <https://www.gnu.org/licenses/>. |
5551 | 22 |
23 ## -*- texinfo -*- | |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
24 ## @deftypefn {} {} blkdiag (@var{A}, @var{B}, @var{C}, @dots{}) |
12639
4d777e05d47c
doc: Review and update documentation for "Matrix Manipulation" chapter.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
25 ## Build a block diagonal matrix from @var{A}, @var{B}, @var{C}, @dots{} |
20158
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
26 ## |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
27 ## All arguments must be numeric and either two-dimensional matrices or |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
28 ## scalars. If any argument is of type sparse, the output will also be sparse. |
13118
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
29 ## @seealso{diag, horzcat, vertcat, sparse} |
5551 | 30 ## @end deftypefn |
31 | |
32 ## Author: Daniel Calvelo | |
33 ## Modified by: William Poetra Yoga Hadisoeseno | |
34 | |
35 function retval = blkdiag (varargin) | |
36 | |
37 if (nargin < 1) | |
6046 | 38 print_usage (); |
5551 | 39 endif |
40 | |
12931
cefd568ea073
Replace function handles with function names in cellfun calls for 15% speedup.
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
41 if (! all (cellfun ("isnumeric", varargin))) |
5552 | 42 error ("blkdiag: all arguments must be numeric"); |
5551 | 43 endif |
44 | |
5552 | 45 ## Note: trailing singletons are automatically (correctly) ignored. |
5569 | 46 if (! all (cellfun ("ndims", varargin) == 2)) |
5657 | 47 error ("blkdiag: all arguments must be two-dimensional matrices"); |
5551 | 48 endif |
49 | |
5552 | 50 ## size is an option for cellfun, but it's a bit different from |
51 ## calling size directly. | |
11191
01ddaedd6ad5
Reverse changeset b1f4bdc276b6. Use all lower case for "uniformoutput" option.
Rik <octave@nomad.inbox5.com>
parents:
8920
diff
changeset
|
52 tmp = cell2mat (cellfun (@size, varargin', "uniformoutput", false)); |
5989 | 53 csz = cumsum ([0 0; tmp], 1); |
13118
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
54 |
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
55 if (any (cellfun ("issparse", varargin))) |
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
56 retval = sparse (csz(end,1), csz(end,2)); |
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
57 else |
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
58 retval = zeros (csz(end,:)); |
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
59 endif |
5592 | 60 |
61 for p = 1:nargin | |
8120
8f0150a0d19e
fix blkdiag to not rely on Matlab-incompatible behaviour
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
62 vp = varargin{p}; |
8f0150a0d19e
fix blkdiag to not rely on Matlab-incompatible behaviour
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
63 if (! isempty (vp)) |
8f0150a0d19e
fix blkdiag to not rely on Matlab-incompatible behaviour
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
64 retval((csz(p,1)+1):csz(p+1,1),(csz(p,2)+1):csz(p+1,2)) = vp; |
8f0150a0d19e
fix blkdiag to not rely on Matlab-incompatible behaviour
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
65 endif |
5551 | 66 endfor |
67 | |
68 endfunction | |
69 | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
70 |
13118
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
71 ## regular tests |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
72 %!assert (blkdiag (1,ones (2),1), [1,0,0,0;0,1,1,0;0,1,1,0;0,0,0,1]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
73 %!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]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
74 %!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]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
75 %!assert (blkdiag ([1,2;3,4],[5,6,7]), [1,2,0,0,0;3,4,0,0,0;0,0,5,6,7]) |
13118
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
76 ## tests involving empty matrices |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
77 %!assert (blkdiag ([],[],[]), []) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
78 %!assert (blkdiag ([],[1,2;3,4],[],5,[]), [1,2,0;3,4,0;0,0,5]) |
21317
a4faec57f4c8
maint: remove semicolon after %!assert tests to follow Octave conventions.
Rik <rik@octave.org>
parents:
20852
diff
changeset
|
79 %!assert (blkdiag (zeros (1,0,1),[1,2,3],1,0,5,zeros (0,1,1)), [0,0,0,0,0,0,0;1,2,3,0,0,0,0;0,0,0,1,0,0,0;0,0,0,0,0,0,0;0,0,0,0,0,5,0]) |
13118
c6601cb63e4e
Improve blkdiag for sparse matrices
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12931
diff
changeset
|
80 ## tests involving sparse matrices |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
81 %!assert (blkdiag (sparse ([1,2;3,4]),[5,6;7,8]), sparse ([1,2,0,0;3,4,0,0;0,0,5,6;0,0,7,8])) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
82 %!assert (blkdiag (sparse ([1,2;3,4]),[5,6]), sparse ([1,2,0,0;3,4,0,0;0,0,5,6])) |
19833
9fc020886ae9
maint: Clean up m-files to follow Octave coding conventions.
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
83 ## sanity checks |
5551 | 84 %!test |
85 %! A = rand (round (rand (1, 2) * 10)); | |
86 %! assert (blkdiag (A), A); |