comparison scripts/general/gradient.m @ 8507:cadc73247d65

style fixes
author John W. Eaton <jwe@octave.org>
date Tue, 13 Jan 2009 14:08:36 -0500
parents eb7bdde776f2
children b297b86f4ad9
comparison
equal deleted inserted replaced
8506:bc982528de11 8507:cadc73247d65
49 ## @end deftypefn 49 ## @end deftypefn
50 50
51 ## Author: Kai Habel <kai.habel@gmx.de> 51 ## Author: Kai Habel <kai.habel@gmx.de>
52 ## Modified: David Bateman <dbateman@free.fr> Added NDArray support 52 ## Modified: David Bateman <dbateman@free.fr> Added NDArray support
53 53
54 function [varargout] = gradient (M, varargin) 54 function varargout = gradient (M, varargin)
55 55
56 if (nargin < 1) 56 if (nargin < 1)
57 print_usage () 57 print_usage ()
58 endif 58 endif
59 59
60 transposed = false; 60 transposed = false;
61 if (isvector (M)) 61 if (isvector (M))
62 ## make a column vector 62 ## Make a column vector.
63 transposed = (size (M, 2) == 1); 63 transposed = (size (M, 2) == 1);
64 M = M(:)'; 64 M = M(:)';
65 endif 65 endif
66 66
67 nd = ndims (M); 67 nd = ndims (M);
70 print_usage () 70 print_usage ()
71 endif 71 endif
72 72
73 d = cell (1, nd); 73 d = cell (1, nd);
74 if (nargin == 1) 74 if (nargin == 1)
75 for i=1:nd 75 for i = 1:nd
76 d{i} = ones (sz(i), 1); 76 d{i} = ones (sz(i), 1);
77 endfor 77 endfor
78 elseif (nargin == 2) 78 elseif (nargin == 2)
79 if (isscalar (varargin{1})) 79 if (isscalar (varargin{1}))
80 for i = 1:nd 80 for i = 1:nd
84 for i = 1:nd 84 for i = 1:nd
85 d{i} = varargin{1}; 85 d{i} = varargin{1};
86 endfor 86 endfor
87 endif 87 endif
88 else 88 else
89 for i=1:nd 89 for i = 1:nd
90 if (isscalar (varargin{i})) 90 if (isscalar (varargin{i}))
91 ## Why the hell did matlab decide to swap these two values? 91 ## Why the hell did Matlab decide to swap these two values?
92 if (i == 1) 92 if (i == 1)
93 d{2} = varargin{1} * ones (sz(2), 1); 93 d{2} = varargin{1} * ones (sz(2), 1);
94 elseif (i == 2) 94 elseif (i == 2)
95 d{1} = varargin{2} * ones (sz(1), 1); 95 d{1} = varargin{2} * ones (sz(1), 1);
96 else 96 else
97 d{i} = varargin{i} * ones (sz(i), 1); 97 d{i} = varargin{i} * ones (sz(i), 1);
98 endif 98 endif
99 else 99 else
100 ## Why the hell did matlab decide to swap these two values? 100 ## Why the hell did Matlab decide to swap these two values?
101 if (i == 1) 101 if (i == 1)
102 d{2} = varargin{1}; 102 d{2} = varargin{1};
103 elseif (i == 2) 103 elseif (i == 2)
104 d{1} = varargin{2}; 104 d{1} = varargin{2};
105 else 105 else
113 mr = sz(i); 113 mr = sz(i);
114 mc = prod ([sz(1:i-1), sz(i+1:nd)]); 114 mc = prod ([sz(1:i-1), sz(i+1:nd)]);
115 Y = zeros (size (M), class (M)); 115 Y = zeros (size (M), class (M));
116 116
117 if (mr > 1) 117 if (mr > 1)
118 ## top and bottom boundary 118 ## Top and bottom boundary.
119 Y(1,:) = diff (M(1:2,:)) / d{i}(1); 119 Y(1,:) = diff (M(1:2,:)) / d{i}(1);
120 Y(mr,:) = diff (M(mr-1:mr,:)) / d{i}(mr-1); 120 Y(mr,:) = diff (M(mr-1:mr,:)) / d{i}(mr-1);
121 endif 121 endif
122 122
123 if (mr > 2) 123 if (mr > 2)
124 ## interior points 124 ## Interior points.
125 Y(2:mr-1,:) = (M(3:mr,:) .- M(1:mr-2,:)) ... 125 Y(2:mr-1,:) = (M(3:mr,:) .- M(1:mr-2,:)) ...
126 ./ kron (d{i}(1:mr-2) .+ d{i}(2:mr-1), ones (1, mc)); 126 ./ kron (d{i}(1:mr-2) .+ d{i}(2:mr-1), ones (1, mc));
127 endif 127 endif
128 varargout{i} = ipermute (Y, [i:nd,1:i-1]); 128 varargout{i} = ipermute (Y, [i:nd,1:i-1]);
129 M = permute (M, [2:nd,1]); 129 M = permute (M, [2:nd,1]);
130 endfor 130 endfor
131 131
132 ## Why the hell did matlab decide to swap these two values? 132 ## Why the hell did Matlab decide to swap these two values?
133 tmp = varargout{1}; 133 tmp = varargout{1};
134 varargout{1} = varargout{2}; 134 varargout{1} = varargout{2};
135 varargout{2} = tmp; 135 varargout{2} = tmp;
136 136
137 if (transposed) 137 if (transposed)