annotate scripts/general/diff.m @ 9141:c1fff751b5a8

Update section 17.1 (Utility Functions) of arith.txi Split section into "Exponents and Logarithms" and "Utility Functions" Use Tex in many more of the doc strings for pretty printing in pdf format.
author Rik <rdrider0-list@yahoo.com>
date Mon, 20 Apr 2009 17:16:09 -0700
parents 1bf0ce0930be
children 923c7cb7f13f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8920
eb63fbe60fab update copyright notices
John W. Eaton <jwe@octave.org>
parents: 8517
diff changeset
1 ## Copyright (C) 1995, 1996, 1999, 2000, 2002, 2004, 2005, 2006, 2007,
eb63fbe60fab update copyright notices
John W. Eaton <jwe@octave.org>
parents: 8517
diff changeset
2 ## 2008, 2009 Kurt Hornik
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
3 ##
3922
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
4 ## This file is part of Octave.
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
5 ##
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
7 ## under the terms of the GNU General Public License as published by
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
9 ## your option) any later version.
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
10 ##
3922
38c61cbf086c [project @ 2002-05-01 06:48:35 by jwe]
jwe
parents: 3456
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
14 ## General Public License for more details.
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
15 ##
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6046
diff changeset
18 ## <http://www.gnu.org/licenses/>.
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
19
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
20 ## -*- texinfo -*-
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
21 ## @deftypefn {Function File} {} diff (@var{x}, @var{k}, @var{dim})
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
22 ## If @var{x} is a vector of length @var{n}, @code{diff (@var{x})} is the
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
23 ## vector of first differences
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
24 ## @iftex
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
25 ## @tex
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
26 ## $x_2 - x_1, \ldots{}, x_n - x_{n-1}$.
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
27 ## @end tex
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
28 ## @end iftex
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7411
diff changeset
29 ## @ifnottex
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
30 ## @var{x}(2) - @var{x}(1), @dots{}, @var{x}(n) - @var{x}(n-1).
8517
81d6ab3ac93c Allow documentation tobe built for other formats than tex and info
sh@sh-laptop
parents: 7411
diff changeset
31 ## @end ifnottex
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
32 ##
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
33 ## If @var{x} is a matrix, @code{diff (@var{x})} is the matrix of column
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
34 ## differences along the first non-singleton dimension.
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
35 ##
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
36 ## The second argument is optional. If supplied, @code{diff (@var{x},
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
37 ## @var{k})}, where @var{k} is a nonnegative integer, returns the
9041
853f96e8008f Cleanup documentation file matrix.texi
Rik <rdrider0-list@yahoo.com>
parents: 8920
diff changeset
38 ## @var{k}-th differences. It is possible that @var{k} is larger than
853f96e8008f Cleanup documentation file matrix.texi
Rik <rdrider0-list@yahoo.com>
parents: 8920
diff changeset
39 ## then first non-singleton dimension of the matrix. In this case,
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
40 ## @code{diff} continues to take the differences along the next
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
41 ## non-singleton dimension.
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
42 ##
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
43 ## The dimension along which to take the difference can be explicitly
9051
1bf0ce0930be Grammar check TexInfo in all .m files
Rik <rdrider0-list@yahoo.com>
parents: 9041
diff changeset
44 ## stated with the optional variable @var{dim}. In this case the
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
45 ## @var{k}-th order differences are calculated along this dimension.
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
46 ## In the case where @var{k} exceeds @code{size (@var{x}, @var{dim})}
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
47 ## then an empty matrix is returned.
3369
f37ca3017116 [project @ 1999-11-21 16:26:02 by jwe]
jwe
parents: 2539
diff changeset
48 ## @end deftypefn
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
49
5428
2a16423e4aa0 [project @ 2005-08-23 18:38:27 by jwe]
jwe
parents: 5307
diff changeset
50 ## Author: KH <Kurt.Hornik@wu-wien.ac.at>
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
51 ## Created: 2 February 1995
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
52 ## Adapted-By: jwe
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
53
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
54 function x = diff (x, k, dim)
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
55
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
56 if (nargin < 1 || nargin > 3)
6046
34f96dd5441b [project @ 2006-10-10 16:10:25 by jwe]
jwe
parents: 5443
diff changeset
57 print_usage ();
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
58 endif
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
59
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
60 if (nargin < 2 || isempty(k))
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
61 k = 1;
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
62 else
4030
22bd65326ec1 [project @ 2002-08-09 18:58:13 by jwe]
jwe
parents: 3922
diff changeset
63 if (! (isscalar (k) && k == round (k) && k >= 0))
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
64 error ("diff: k must be a nonnegative integer");
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
65 elseif (k == 0)
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
66 return;
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
67 endif
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
68 endif
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
69
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
70 nd = ndims (x);
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
71 sz = size (x);
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
72 if (nargin != 3)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
73 %% Find the first non-singleton dimension
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
74 dim = 1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
75 while (dim < nd + 1 && sz (dim) == 1)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
76 dim = dim + 1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
77 endwhile
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
78 if (dim > nd)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
79 dim = 1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
80 endif
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
81 else
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
82 if (! (isscalar (dim) && dim == round (dim)) && dim > 0 &&
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
83 dim < (nd + 1))
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
84 error ("diff: dim must be an integer and valid dimension");
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
85 endif
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
86 endif
3426
f8dde1807dee [project @ 2000-01-13 08:40:00 by jwe]
jwe
parents: 3369
diff changeset
87
5443
ec8c33dcd1bf [project @ 2005-09-08 01:40:57 by jwe]
jwe
parents: 5428
diff changeset
88 if (ischar (x))
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
89 error ("diff: symbolic differentiation not (yet) supported");
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
90 endif
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
91
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
92
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
93 if (nargin == 3)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
94 if (sz (dim) <= k)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
95 sz(dim) = 0;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
96 x = zeros (sz);
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
97 else
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
98 n = sz (dim);
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
99 idx1 = cell ();
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
100 for i = 1:nd
7208
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
101 idx1{i} = 1:sz(i);
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
102 endfor
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
103 idx2 = idx1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
104 for i = 1 : k;
7208
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
105 idx1{dim} = 2 : (n - i + 1);
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
106 idx2{dim} = 1 : (n - i);
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
107 x = x(idx1{:}) - x(idx2{:});
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
108 endfor
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
109 endif
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
110 else
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
111 if (sum (sz - 1) < k)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
112 x = [];
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
113 else
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
114 idx1 = cell ();
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
115 for i = 1:nd
7208
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
116 idx1{i} = 1:sz(i);
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
117 endfor
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
118 idx2 = idx1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
119 while (k)
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
120 n = sz (dim);
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
121 for i = 1 : min (k, n - 1)
7208
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
122 idx1{dim} = 2 : (n - i + 1);
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
123 idx2{dim} = 1 : (n - i);
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
124 x = x(idx1{:}) - x(idx2{:});
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
125 endfor
7208
a730e47fda4d [project @ 2007-11-28 02:32:41 by jwe]
jwe
parents: 7017
diff changeset
126 idx1{dim} = idx2{dim} = 1;
4869
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
127 k = k - min (k, n - 1);
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
128 dim = dim + 1;
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
129 endwhile
b92d59213e63 [project @ 2004-04-21 17:03:02 by jwe]
jwe
parents: 4030
diff changeset
130 endif
2539
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
131 endif
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
132
1dca28c213f0 [project @ 1996-11-19 23:54:48 by jwe]
jwe
parents:
diff changeset
133 endfunction
7411
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
134
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
135 %!assert((diff ([1, 2, 3, 4]) == [1, 1, 1]
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
136 %! && diff ([1, 3, 7, 19], 2) == [2, 8]
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
137 %! && diff ([1, 2; 5, 4; 8, 7; 9, 6; 3, 1]) == [4, 2; 3, 3; 1, -1; -6, -5]
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
138 %! && diff ([1, 2; 5, 4; 8, 7; 9, 6; 3, 1], 3) == [-1, -5; -5, 0]
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
139 %! && isempty (diff (1))));
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
140
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
141 %!error diff ([1, 2; 3, 4], -1);
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
142
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
143 %!error diff ("foo");
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
144
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
145 %!error diff ();
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
146
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
147 %!error diff (1, 2, 3, 4);
83a8781b529d [project @ 2008-01-22 21:52:25 by jwe]
jwe
parents: 7208
diff changeset
148