Mercurial > hg > octave-nkf
annotate scripts/special-matrix/hankel.m @ 13888:c78ac846fcbc
hankel.m: Recode for 3.5X speedup
* hankel.m: Recode for 3.5X speedup
author | Rik <octave@nomad.inbox5.com> |
---|---|
date | Fri, 18 Nov 2011 12:28:20 -0800 |
parents | 4d777e05d47c |
children | 72c96de7a403 |
rev | line source |
---|---|
11523 | 1 ## Copyright (C) 1993-2011 John W. Eaton |
2313 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
2313 | 9 ## |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
245 | 18 |
3369 | 19 ## -*- texinfo -*- |
10791
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9211
diff
changeset
|
20 ## @deftypefn {Function File} {} hankel (@var{c}) |
3140cb7a05a1
Add spellchecker scripts for Octave and run spellcheck of documentation
Rik <octave@nomad.inbox5.com>
parents:
9211
diff
changeset
|
21 ## @deftypefnx {Function File} {} hankel (@var{c}, @var{r}) |
12639
4d777e05d47c
doc: Review and update documentation for "Matrix Manipulation" chapter.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
22 ## Return the Hankel matrix constructed from the first column @var{c}, and |
3369 | 23 ## (optionally) the last row @var{r}. If the last element of @var{c} is |
24 ## not the same as the first element of @var{r}, the last element of | |
4922 | 25 ## @var{c} is used. If the second argument is omitted, it is assumed to |
26 ## be a vector of zeros with the same size as @var{c}. | |
3426 | 27 ## |
3369 | 28 ## A Hankel matrix formed from an m-vector @var{c}, and an n-vector |
29 ## @var{r}, has the elements | |
30 ## @tex | |
31 ## $$ | |
32 ## H (i, j) = \cases{c_{i+j-1},&$i+j-1\le m$;\cr r_{i+j-m},&otherwise.\cr} | |
33 ## $$ | |
34 ## @end tex | |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7411
diff
changeset
|
35 ## @ifnottex |
3426 | 36 ## |
3369 | 37 ## @example |
38 ## @group | |
4922 | 39 ## H(i,j) = c(i+j-1), i+j-1 <= m; |
40 ## H(i,j) = r(i+j-m), otherwise | |
3369 | 41 ## @end group |
42 ## @end example | |
10821
693e22af08ae
Grammarcheck documentation of m-files
Rik <octave@nomad.inbox5.com>
parents:
10791
diff
changeset
|
43 ## |
8517
81d6ab3ac93c
Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents:
7411
diff
changeset
|
44 ## @end ifnottex |
12639
4d777e05d47c
doc: Review and update documentation for "Matrix Manipulation" chapter.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
45 ## @seealso{hadamard, toeplitz} |
3369 | 46 ## @end deftypefn |
4 | 47 |
2314 | 48 ## Author: jwe |
49 | |
2311 | 50 function retval = hankel (c, r) |
4 | 51 |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
52 if (nargin < 1 || nargin > 2) |
6046 | 53 print_usage (); |
4 | 54 endif |
55 | |
2325 | 56 if (nargin == 1) |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
57 |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
58 if (! isvector (c)) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
59 error ("hankel: C must be a vector"); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
60 endif |
1396 | 61 |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
62 nr = length (c); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
63 nc = nr; |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
64 data = [c(:) ; zeros(nr, 1)]; |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
65 |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
66 else |
4 | 67 |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
68 if (! (isvector (c) && isvector (r))) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
69 error ("hankel: C and R must be vectors"); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
70 elseif (r(1) != c(end)) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
71 warning ("hankel: column wins anti-diagonal conflict"); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
72 endif |
4 | 73 |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
74 nr = length (c); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
75 nc = length (r); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
76 data = [c(:) ; r(2:end)(:)]; |
1396 | 77 |
4 | 78 endif |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
79 |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
80 slices = cellslices (data, 1:nc, nr:1:nc+nr-1); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
81 retval = horzcat (slices{:}); |
4 | 82 |
83 endfunction | |
5731 | 84 |
7411 | 85 |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
86 %!assert (hankel (1), [1]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
87 %!assert (hankel ([1, 2]), [1, 2; 2, 0]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
88 %!assert (hankel ([1, 2], [2; -1; -3]), [1, 2, -1; 2, -1, -3]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
89 %!assert (hankel (1:3), [1,2,3;2,3,0;3,0,0]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
90 %!assert (hankel (1:3,3:6), [1,2,3,4;2,3,4,5;3,4,5,6]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
91 %!assert (hankel (1:3,3:4), [1,2;2,3;3,4]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
92 %!assert (hankel (1:3,4:6), [1,2,3;2,3,5;3,5,6]) |
7411 | 93 |
94 %!error hankel (); | |
13888
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
95 %!error hankel (1, 2, 3); |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
96 %!error <C must be a vector> hankel ([1, 2; 3, 4]) |
c78ac846fcbc
hankel.m: Recode for 3.5X speedup
Rik <octave@nomad.inbox5.com>
parents:
12639
diff
changeset
|
97 %!error <C and R must be vectors> hankel (1:4, [1, 2; 3, 4]) |
7411 | 98 |