annotate src/DLD-FUNCTIONS/__convn__.cc @ 7648:e7b999840056

Added tests to scripts/polynomial/convn.m and allow '__convn__' to actually get N-dimensional complex data.
author sh@sh-laptop
date Wed, 26 Mar 2008 15:55:20 -0400
parents 3398ce778b4b
children 5f6e11567f70
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7640
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
1 /*
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
2
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
3 Copyright (C) 2008 Soren Hauberg
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
4
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
5 This file is part of Octave.
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
6
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
10 option) any later version.
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
11
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
15 for more details.
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
16
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
19 <http://www.gnu.org/licenses/>.
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
20
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
21 */
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
22
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
24 #include <config.h>
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
25 #endif
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
26
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
27 #include <algorithm>
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
28
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
29 #include "dNDArray.h"
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
30 #include "CNDArray.h"
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
31
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
32 #include "defun-dld.h"
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
33
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
34 // FIXME -- this function should maybe be available in liboctave?
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
35 template <class MT, class ST>
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
36 octave_value
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
37 convn (const MT& a, const MT& b)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
38 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
39 octave_value retval;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
40
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
41 // Get sizes
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
42 const octave_idx_type ndims = a.ndims ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
43 const octave_idx_type b_numel = b.numel ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
44
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
45 const dim_vector a_size = a.dims ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
46 const dim_vector b_size = b.dims ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
47
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
48 if (ndims != b.ndims ())
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
49 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
50 error ("__convn__: first and second argument must have same dimensionality");
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
51 return retval;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
52 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
53
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
54 // Allocate output
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
55 dim_vector out_size (a_size);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
56 for (octave_idx_type n = 0; n < ndims; n++)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
57 out_size(n) = std::max (a_size(n) - b_size(n) + 1, 0);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
58
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
59 MT out = MT (out_size);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
60
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
61 const octave_idx_type out_numel = out.numel ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
62
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
63 // Iterate over every element of 'out'.
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
64 dim_vector idx_dim (ndims);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
65
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
66 Array<octave_idx_type> a_idx (idx_dim);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
67 Array<octave_idx_type> b_idx (idx_dim);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
68 Array<octave_idx_type> out_idx (idx_dim, 0);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
69
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
70 for (octave_idx_type i = 0; i < out_numel; i++)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
71 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
72 OCTAVE_QUIT;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
73
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
74 // For each neighbour
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
75 ST sum = 0;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
76
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
77 for (octave_idx_type n = 0; n < ndims; n++)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
78 b_idx(n) = 0;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
79
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
80 for (octave_idx_type j = 0; j < b_numel; j++)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
81 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
82 for (octave_idx_type n = 0; n < ndims; n++)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
83 a_idx(n) = out_idx(n) + (b_size(n) - 1 - b_idx(n));
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
84
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
85 sum += a(a_idx) * b(b_idx);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
86
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
87 b.increment_index (b_idx, b_size);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
88 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
89
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
90 // Compute filter result
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
91 out(out_idx) = sum;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
92
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
93 // Prepare for next iteration
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
94 out.increment_index (out_idx, out_size);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
95 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
96
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
97 return out;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
98 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
99
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
100 DEFUN_DLD (__convn__, args, ,
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
101 "-*- texinfo -*-\n\
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
102 @deftypefn {Loadable Function} {} __convn__(@var{a}, @var{b})\n\
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
103 Undocumented internal function.\n\
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
104 @end deftypefn\n\
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
105 ")
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
106 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
107 octave_value retval;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
108
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
109 if (args.length () == 2)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
110 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
111 if (args(0).is_real_type () && args(1).is_real_type ())
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
112 {
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
113 const NDArray a = args (0).array_value ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
114 const NDArray b = args (1).array_value ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
115
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
116 if (! error_state)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
117 retval = convn<NDArray, double> (a, b);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
118 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
119 else if (args(0).is_complex_type () && args(1).is_complex_type ())
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
120 {
7648
e7b999840056 Added tests to scripts/polynomial/convn.m and allow '__convn__' to actually get N-dimensional complex data.
sh@sh-laptop
parents: 7640
diff changeset
121 const ComplexNDArray a = args (0).complex_array_value ();
e7b999840056 Added tests to scripts/polynomial/convn.m and allow '__convn__' to actually get N-dimensional complex data.
sh@sh-laptop
parents: 7640
diff changeset
122 const ComplexNDArray b = args (1).complex_array_value ();
7640
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
123
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
124 if (! error_state)
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
125 retval = convn<ComplexNDArray, Complex> (a, b);
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
126 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
127 else
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
128 error ("__convn__: first and second input should be real, or complex arrays");
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
129 }
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
130 else
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
131 print_usage ();
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
132
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
133 return retval;
3398ce778b4b Added support for N-dimensional convolution
sh@sh-laptop
parents:
diff changeset
134 }