MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / convolve2_unwrap

Function convolve2_unwrap

src/backend/cpu/convolve.cpp:124–158  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

122
123template<typename T>
124Array<T> convolve2_unwrap(const Array<T> &signal, const Array<T> &filter,
125 const dim4 &stride, const dim4 &padding,
126 const dim4 &dilation) {
127 dim4 sDims = signal.dims();
128 dim4 fDims = filter.dims();
129
130 dim_t outputWidth =
131 1 + (sDims[0] + 2 * padding[0] - (((fDims[0] - 1) * dilation[0]) + 1)) /
132 stride[0];
133 dim_t outputHeight =
134 1 + (sDims[1] + 2 * padding[1] - (((fDims[1] - 1) * dilation[1]) + 1)) /
135 stride[1];
136
137 const bool retCols = false;
138 Array<T> unwrapped =
139 unwrap(signal, fDims[0], fDims[1], stride[0], stride[1], padding[0],
140 padding[1], dilation[0], dilation[1], retCols);
141
142 unwrapped = reorder(unwrapped, dim4(1, 2, 0, 3));
143 dim4 uDims = unwrapped.dims();
144 unwrapped =
145 modDims(unwrapped, dim4(uDims[0] * uDims[1], uDims[2] * uDims[3]));
146
147 Array<T> collapsedFilter = flip(filter, {1, 1, 0, 0});
148 collapsedFilter = modDims(collapsedFilter,
149 dim4(fDims[0] * fDims[1] * fDims[2], fDims[3]));
150
151 Array<T> res =
152 matmul(unwrapped, collapsedFilter, AF_MAT_TRANS, AF_MAT_NONE);
153 res = modDims(res, dim4(outputWidth, outputHeight, signal.dims()[3],
154 collapsedFilter.dims()[1]));
155 Array<T> out = reorder(res, dim4(0, 1, 3, 2));
156
157 return out;
158}
159
160template<typename T>
161Array<T> convolve2(Array<T> const &signal, Array<T> const &filter,

Callers

nothing calls this directly

Calls 7

unwrapFunction · 0.70
reorderFunction · 0.70
dim4Class · 0.70
matmulFunction · 0.70
modDimsFunction · 0.50
flipFunction · 0.50
dimsMethod · 0.45

Tested by

no test coverage detected