@@ -38,41 +38,7 @@ impl<'a, A, D: Dimension> Windows<'a, A, D> {
38
38
let strides = axis_strides. into_dimension ( ) ;
39
39
let window_strides = a. strides . clone ( ) ;
40
40
41
- ndassert ! (
42
- a. ndim( ) == window. ndim( ) ,
43
- concat!(
44
- "Window dimension {} does not match array dimension {} " ,
45
- "(with array of shape {:?})"
46
- ) ,
47
- window. ndim( ) ,
48
- a. ndim( ) ,
49
- a. shape( )
50
- ) ;
51
-
52
- ndassert ! (
53
- a. ndim( ) == strides. ndim( ) ,
54
- concat!(
55
- "Stride dimension {} does not match array dimension {} " ,
56
- "(with array of shape {:?})"
57
- ) ,
58
- strides. ndim( ) ,
59
- a. ndim( ) ,
60
- a. shape( )
61
- ) ;
62
-
63
- let mut base = a;
64
- base. slice_each_axis_inplace ( |ax_desc| {
65
- let len = ax_desc. len ;
66
- let wsz = window[ ax_desc. axis . index ( ) ] ;
67
- let stride = strides[ ax_desc. axis . index ( ) ] ;
68
-
69
- if len < wsz {
70
- Slice :: new ( 0 , Some ( 0 ) , 1 )
71
- } else {
72
- Slice :: new ( 0 , Some ( ( len - wsz + 1 ) as isize ) , stride as isize )
73
- }
74
- } ) ;
75
-
41
+ let base = build_base ( a, window. clone ( ) , strides) ;
76
42
Windows {
77
43
base,
78
44
window,
@@ -162,28 +128,22 @@ pub struct AxisWindows<'a, A, D>{
162
128
impl < ' a , A , D : Dimension > AxisWindows < ' a , A , D > {
163
129
pub ( crate ) fn new ( a : ArrayView < ' a , A , D > , axis : Axis , window_size : usize ) -> Self
164
130
{
165
- let strides = a. strides . clone ( ) ;
166
- let mut base = a;
131
+ let window_strides = a. strides . clone ( ) ;
167
132
let axis_idx = axis. index ( ) ;
168
- let mut window = base. raw_dim ( ) ;
169
- window[ axis_idx] = window_size;
170
133
171
- base. slice_each_axis_inplace ( |ax_desc| {
172
- let len = ax_desc. len ;
173
- let wsz = window[ ax_desc. axis . index ( ) ] ;
134
+ let mut window = a. raw_dim ( ) ;
135
+ window[ axis_idx] = window_size;
174
136
175
- if len < wsz {
176
- Slice :: new ( 0 , Some ( 0 ) , 1 )
177
- } else {
178
- Slice :: new ( 0 , Some ( ( len - wsz + 1 ) as isize ) , 1 )
179
- }
180
- } ) ;
137
+ let ndim = window. ndim ( ) ;
138
+ let mut unit_stride = D :: zeros ( ndim) ;
139
+ unit_stride. slice_mut ( ) . fill ( 1 ) ;
181
140
141
+ let base = build_base ( a, window. clone ( ) , unit_stride) ;
182
142
AxisWindows {
183
143
base,
184
144
axis_idx,
185
145
window,
186
- strides,
146
+ strides : window_strides ,
187
147
}
188
148
}
189
149
}
@@ -263,3 +223,44 @@ where
263
223
}
264
224
}
265
225
}
226
+
227
+ /// build the base array of the `Windows` and `AxisWindows` structs
228
+ fn build_base < ' a , A , D > ( a : ArrayView < ' a , A , D > , window : D , strides : D ) -> ArrayView < ' a , A , D >
229
+ where D : Dimension
230
+ {
231
+ ndassert ! (
232
+ a. ndim( ) == window. ndim( ) ,
233
+ concat!(
234
+ "Window dimension {} does not match array dimension {} " ,
235
+ "(with array of shape {:?})"
236
+ ) ,
237
+ window. ndim( ) ,
238
+ a. ndim( ) ,
239
+ a. shape( )
240
+ ) ;
241
+
242
+ ndassert ! (
243
+ a. ndim( ) == strides. ndim( ) ,
244
+ concat!(
245
+ "Stride dimension {} does not match array dimension {} " ,
246
+ "(with array of shape {:?})"
247
+ ) ,
248
+ strides. ndim( ) ,
249
+ a. ndim( ) ,
250
+ a. shape( )
251
+ ) ;
252
+
253
+ let mut base = a;
254
+ base. slice_each_axis_inplace ( |ax_desc| {
255
+ let len = ax_desc. len ;
256
+ let wsz = window[ ax_desc. axis . index ( ) ] ;
257
+ let stride = strides[ ax_desc. axis . index ( ) ] ;
258
+
259
+ if len < wsz {
260
+ Slice :: new ( 0 , Some ( 0 ) , 1 )
261
+ } else {
262
+ Slice :: new ( 0 , Some ( ( len - wsz + 1 ) as isize ) , stride as isize )
263
+ }
264
+ } ) ;
265
+ base
266
+ }
0 commit comments