Mercurial > hg > octave-nkf
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) |