23 #if defined (HAVE_CONFIG_H)
36 template <
typename T,
typename R>
43 #define FORWARD_IMPL(T_CXX, R_CXX, T, R, T_CAST, T_CONST_CAST, \
47 F77_FUNC (f##conv2o, F##CONV2O) (const F77_INT&, \
49 const T*, const F77_INT&, \
50 const F77_INT&, const R*, T *); \
54 F77_FUNC (f##conv2i, F##CONV2I) (const F77_INT&, \
56 const T*, const F77_INT&, \
57 const F77_INT&, const R*, T *); \
60 convolve_2d<T_CXX, R_CXX> (const T_CXX *a, F77_INT ma, F77_INT na, \
61 const R_CXX *b, F77_INT mb, F77_INT nb, \
62 T_CXX *c, bool inner) \
65 F77_XFCN (f##conv2i, F##CONV2I, (ma, na, T_CONST_CAST (a), \
66 mb, nb, R_CONST_CAST (b), \
69 F77_XFCN (f##conv2o, F##CONV2O, (ma, na, T_CONST_CAST (a), \
70 mb, nb, R_CONST_CAST (b), \
85 F77_DBLE_CMPLX,
F77_DBLE, F77_DBLE_CMPLX_ARG,
86 F77_CONST_DBLE_CMPLX_ARG, , zd, ZD)
87 FORWARD_IMPL (
std::complex<
float>,
float, F77_CMPLX, F77_REAL, F77_CMPLX_ARG,
88 F77_CONST_CMPLX_ARG, , cs, CS)
90 template <typename T, typename R>
93 T *c, const
dim_vector& ccd,
int nd,
bool inner)
96 convolve_2d<T, R> (
a, ad(0), ad(1),
b, bd(0), bd(1),
c, inner);
108 convolve_nd<T, R> (a + ma*(ja+jb), ad, acd,
109 b + mb*(nb-jb-1), bd, bcd,
110 c + ldc*ja, ccd, nd-1, inner);
116 convolve_nd<T, R> (a + ma*ja, ad, acd, b + mb*jb, bd, bcd,
117 c + ldc*(ja+jb), ccd, nd-1, inner);
124 template <
typename T,
typename R>
137 for (
int i = 0;
i < nd;
i++)
141 static_cast<octave_idx_type> (0));
144 static_cast<octave_idx_type> (0));
149 convolve_nd<T, R> (a.
fortran_vec (), adims, adims.cumulative (),
159 for (
int i = 0;
i < nd;
i++)
167 #define CONV_DEFS(TPREF, RPREF) \
169 convn (const TPREF ## NDArray& a, const RPREF ## NDArray& b, \
172 return convolve (a, b, ct); \
175 convn (const TPREF ## Matrix& a, const RPREF ## Matrix& b, \
178 return convolve (a, b, ct); \
181 convn (const TPREF ## Matrix& a, const RPREF ## ColumnVector& c, \
182 const RPREF ## RowVector& r, convn_type ct) \
184 return convolve (a, c * r, ct); \
bool is_empty(void) const
static MArray< T > convolve(const MArray< T > &a, const MArray< R > &b, convn_type ct)
dim_vector cumulative(void) const
Return cumulative dimensions.
#define F77_DBLE_CMPLX_ARG(x)
Template for N-dimensional array classes with like-type math operators.
F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T F77_DBLE &F77_RET_T F77_REAL &F77_RET_T F77_REAL &F77_RET_T F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T F77_REAL F77_REAL &F77_RET_T F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
calling an anonymous function involves an overhead quite comparable to the overhead of an m file function Passing a handle to a built in function is because the interpreter is not involved in the internal loop For a
const dim_vector & dims(void) const
Return a const-reference so that dims ()(i) works efficiently.
#define FORWARD_IMPL(T_CXX, R_CXX, T, R, T_CAST, T_CONST_CAST,R_CONST_CAST, f, F)
void convolve_nd(const T *a, const dim_vector &ad, const dim_vector &acd, const R *b, const dim_vector &bd, const dim_vector &bcd, T *c, const dim_vector &ccd, int nd, bool inner)
#define CONV_DEFS(TPREF, RPREF)
static void convolve_2d(const T *a, octave_idx_type ma, octave_idx_type na, const R *b, octave_idx_type mb, octave_idx_type nb, T *c, bool inner)
dim_vector redim(int n) const
F77_RET_T const F77_INT const F77_INT const F77_INT F77_DBLE const F77_INT F77_DBLE const F77_INT F77_DBLE const F77_INT F77_DBLE * Z
the sparsity preserving column transformation such that that defines the pivoting threshold can be given in which case it defines the c
static dim_vector alloc(int n)
N Dimensional Array with copy-on-write semantics.
charNDArray max(char d, const charNDArray &m)
#define F77_CONST_DBLE_CMPLX_ARG(x)
=val(i)}if ode{val(i)}occurs in table i
#define F77_CONST_CMPLX_ARG(x)
std::complex< float > FloatComplex
std::complex< double > Complex
const T * fortran_vec(void) const
Vector representing the dimensions (size) of an Array.
static idx_vector make_range(octave_idx_type start, octave_idx_type step, octave_idx_type len)
Array< T > index(const idx_vector &i) const
Indexing without resizing.