@@ -59,21 +59,21 @@ for f in (:+, :-, :div, :mod, :&, :|, :$)
5959 return F
6060 end
6161 function ($ f){S,T}(A:: AbstractArray{S} , B:: Range{T} )
62- F = similar (A, promote_op ($ f,S,T), promote_shape (size (A), size (B) ))
62+ F = similar (A, promote_op ($ f,S,T), promote_shape (A,B ))
6363 for (iF, iA, iB) in zip (eachindex (F), eachindex (A), eachindex (B))
6464 @inbounds F[iF] = ($ f)(A[iA], B[iB])
6565 end
6666 return F
6767 end
6868 function ($ f){S,T}(A:: Range{S} , B:: AbstractArray{T} )
69- F = similar (B, promote_op ($ f,S,T), promote_shape (size (A), size (B) ))
69+ F = similar (B, promote_op ($ f,S,T), promote_shape (A,B ))
7070 for (iF, iA, iB) in zip (eachindex (F), eachindex (A), eachindex (B))
7171 @inbounds F[iF] = ($ f)(A[iA], B[iB])
7272 end
7373 return F
7474 end
7575 function ($ f){S,T}(A:: AbstractArray{S} , B:: AbstractArray{T} )
76- F = similar (A, promote_op ($ f,S,T), promote_shape (size (A), size (B) ))
76+ F = similar (A, promote_op ($ f,S,T), promote_shape (A,B ))
7777 for (iF, iA, iB) in zip (eachindex (F), eachindex (A), eachindex (B))
7878 @inbounds F[iF] = ($ f)(A[iA], B[iB])
7979 end
@@ -211,26 +211,29 @@ function flipdim{T}(A::Array{T}, d::Integer)
211211end
212212
213213function rotl90 (A:: AbstractMatrix )
214- m,n = size (A)
215- B = similar (A,(n,m))
216- for i= 1 : m, j= 1 : n # Fixme iter
217- B[n- j+ 1 ,i] = A[i,j]
214+ B = similar_transpose (A)
215+ ind2 = indices (A,2 )
216+ n = first (ind2)+ last (ind2)
217+ for i= indices (A,1 ), j= ind2
218+ B[n- j,i] = A[i,j]
218219 end
219220 return B
220221end
221222function rotr90 (A:: AbstractMatrix )
222- m,n = size (A)
223- B = similar (A,(n,m))
224- for i= 1 : m, j= 1 : n # Fixme iter
225- B[j,m- i+ 1 ] = A[i,j]
223+ B = similar_transpose (A)
224+ ind1 = indices (A,1 )
225+ m = first (ind1)+ last (ind1)
226+ for i= ind1, j= indices (A,2 )
227+ B[j,m- i] = A[i,j]
226228 end
227229 return B
228230end
229231function rot180 (A:: AbstractMatrix )
230- m,n = size (A)
231232 B = similar (A)
232- for i= 1 : m, j= 1 : n # Fixme iter
233- B[m- i+ 1 ,n- j+ 1 ] = A[i,j]
233+ ind1, ind2 = indices (A,1 ), indices (A,2 )
234+ m, n = first (ind1)+ last (ind1), first (ind2)+ last (ind2)
235+ for j= ind2, i= ind1
236+ B[m- i,n- j] = A[i,j]
234237 end
235238 return B
236239end
@@ -243,96 +246,65 @@ end
243246rotr90 (A:: AbstractMatrix , k:: Integer ) = rotl90 (A,- k)
244247rot180 (A:: AbstractMatrix , k:: Integer ) = mod (k, 2 ) == 1 ? rot180 (A) : copy (A)
245248
249+ similar_transpose (A:: AbstractMatrix ) = similar_transpose (indicesbehavior (A), A)
250+ similar_transpose (:: IndicesStartAt1 , A:: AbstractMatrix ) = similar (A, (size (A,2 ), size (A,1 )))
251+ similar_transpose (:: IndicesBehavior , A:: AbstractMatrix ) = similar (A, (indices (A,2 ), indices (A,1 )))
246252
247253# # Transpose ##
248- const transposebaselength= 64
249- function transpose! (B:: AbstractMatrix ,A:: AbstractMatrix )
250- m, n = size (A)
251- size (B,1 ) == n && size (B,2 ) == m || throw (DimensionMismatch (" transpose" ))
252-
253- if m* n<= 4 * transposebaselength
254- @inbounds begin
255- for j = 1 : n # Fixme iter
256- for i = 1 : m # Fixme iter
257- B[j,i] = transpose (A[i,j])
258- end
259- end
260- end
261- else
262- transposeblock! (B,A,m,n,0 ,0 )
263- end
264- return B
265- end
254+ transpose! (B:: AbstractMatrix , A:: AbstractMatrix ) = transpose_f! (transpose, B, A)
255+ ctranspose! (B:: AbstractMatrix , A:: AbstractMatrix ) = transpose_f! (ctranspose, B, A)
266256function transpose! (B:: AbstractVector , A:: AbstractMatrix )
267- length (B ) == length (A ) && size (A,1 ) == 1 || throw (DimensionMismatch (" transpose" ))
257+ indices (B, 1 ) == indices (A, 2 ) && indices (A,1 ) == 1 : 1 || throw (DimensionMismatch (" transpose" ))
268258 copy! (B, A)
269259end
270260function transpose! (B:: AbstractMatrix , A:: AbstractVector )
271- length (B ) == length (A ) && size (B,1 ) == 1 || throw (DimensionMismatch (" transpose" ))
261+ indices (B, 2 ) == indices (A, 1 ) && indices (B,1 ) == 1 : 1 || throw (DimensionMismatch (" transpose" ))
272262 copy! (B, A)
273263end
274- function transposeblock! (B:: AbstractMatrix ,A:: AbstractMatrix ,m:: Int ,n:: Int ,offseti:: Int ,offsetj:: Int )
275- if m* n<= transposebaselength
276- @inbounds begin
277- for j = offsetj+ (1 : n) # Fixme iter
278- for i = offseti+ (1 : m) # Fixme iter
279- B[j,i] = transpose (A[i,j])
280- end
281- end
282- end
283- elseif m> n
284- newm= m>> 1
285- transposeblock! (B,A,newm,n,offseti,offsetj)
286- transposeblock! (B,A,m- newm,n,offseti+ newm,offsetj)
287- else
288- newn= n>> 1
289- transposeblock! (B,A,m,newn,offseti,offsetj)
290- transposeblock! (B,A,m,n- newn,offseti,offsetj+ newn)
291- end
292- return B
264+ function ctranspose! (B:: AbstractVector , A:: AbstractMatrix )
265+ indices (B,1 ) == indices (A,2 ) && indices (A,1 ) == 1 : 1 || throw (DimensionMismatch (" transpose" ))
266+ ccopy! (B, A)
293267end
294- function ctranspose! (B:: AbstractMatrix ,A:: AbstractMatrix )
295- m, n = size (A)
296- size (B,1 ) == n && size (B,2 ) == m || throw (DimensionMismatch (" transpose" ))
268+ function ctranspose! (B:: AbstractMatrix , A:: AbstractVector )
269+ indices (B,2 ) == indices (A,1 ) && indices (B,1 ) == 1 : 1 || throw (DimensionMismatch (" transpose" ))
270+ ccopy! (B, A)
271+ end
272+
273+ const transposebaselength= 64
274+ function transpose_f! (f,B:: AbstractMatrix ,A:: AbstractMatrix )
275+ indices (B,1 ) == indices (A,2 ) && indices (B,2 ) == indices (A,1 ) || throw (DimensionMismatch (string (f)))
297276
277+ m, n = size (A)
298278 if m* n<= 4 * transposebaselength
299279 @inbounds begin
300- for j = 1 : n # Fixme iter
301- for i = 1 : m # Fixme iter
302- B[j,i] = ctranspose (A[i,j])
280+ for j = indices (A, 2 )
281+ for i = indices (A, 1 )
282+ B[j,i] = f (A[i,j])
303283 end
304284 end
305285 end
306286 else
307- ctransposeblock! ( B,A,m,n,0 , 0 )
287+ transposeblock! (f, B,A,m,n,first ( indices (A, 1 )) - 1 , first ( indices (A, 2 )) - 1 )
308288 end
309289 return B
310290end
311- function ctranspose! (B:: AbstractVector , A:: AbstractMatrix )
312- length (B) == length (A) && size (A,1 ) == 1 || throw (DimensionMismatch (" transpose" ))
313- ccopy! (B, A)
314- end
315- function ctranspose! (B:: AbstractMatrix , A:: AbstractVector )
316- length (B) == length (A) && size (B,1 ) == 1 || throw (DimensionMismatch (" transpose" ))
317- ccopy! (B, A)
318- end
319- function ctransposeblock! (B:: AbstractMatrix ,A:: AbstractMatrix ,m:: Int ,n:: Int ,offseti:: Int ,offsetj:: Int )
291+ function transposeblock! (f,B:: AbstractMatrix ,A:: AbstractMatrix ,m:: Int ,n:: Int ,offseti:: Int ,offsetj:: Int )
320292 if m* n<= transposebaselength
321293 @inbounds begin
322- for j = offsetj+ (1 : n) # Fixme iter
323- for i = offseti+ (1 : m) # Fixme iter
324- B[j,i] = ctranspose (A[i,j])
294+ for j = offsetj+ (1 : n)
295+ for i = offseti+ (1 : m)
296+ B[j,i] = f (A[i,j])
325297 end
326298 end
327299 end
328300 elseif m> n
329301 newm= m>> 1
330- ctransposeblock! ( B,A,newm,n,offseti,offsetj)
331- ctransposeblock! ( B,A,m- newm,n,offseti+ newm,offsetj)
302+ transposeblock! (f, B,A,newm,n,offseti,offsetj)
303+ transposeblock! (f, B,A,m- newm,n,offseti+ newm,offsetj)
332304 else
333305 newn= n>> 1
334- ctransposeblock! ( B,A,m,newn,offseti,offsetj)
335- ctransposeblock! ( B,A,m,n- newn,offseti,offsetj+ newn)
306+ transposeblock! (f, B,A,m,newn,offseti,offsetj)
307+ transposeblock! (f, B,A,m,n- newn,offseti,offsetj+ newn)
336308 end
337309 return B
338310end
@@ -343,11 +315,11 @@ function ccopy!(B, A)
343315end
344316
345317function transpose (A:: AbstractMatrix )
346- B = similar (A, size (A, 2 ), size (A, 1 ) )
318+ B = similar_transpose (A )
347319 transpose! (B, A)
348320end
349321function ctranspose (A:: AbstractMatrix )
350- B = similar (A, size (A, 2 ), size (A, 1 ) )
322+ B = similar_transpose (A )
351323 ctranspose! (B, A)
352324end
353325ctranspose {T<:Real} (A:: AbstractVecOrMat{T} ) = transpose (A)
@@ -366,7 +338,7 @@ for (f, f!, fp, op) = ((:cumsum, :cumsum!, :cumsum_pairwise!, :+),
366338 if n < 128
367339 @inbounds s_ = v[i1]
368340 @inbounds c[i1] = ($ op)(s, s_)
369- for i = i1+ 1 : i1+ n- 1 # Fixme iter
341+ for i = i1+ 1 : i1+ n- 1
370342 @inbounds s_ = $ (op)(s_, v[i])
371343 @inbounds c[i] = $ (op)(s, s_)
372344 end
@@ -381,7 +353,7 @@ for (f, f!, fp, op) = ((:cumsum, :cumsum!, :cumsum_pairwise!, :+),
381353 @eval function ($ f!)(result:: AbstractVector , v:: AbstractVector )
382354 n = length (v)
383355 if n == 0 ; return result; end
384- ($ fp)(v, result, $ (op== :+ ? :(zero (v[ 1 ])) : :(one (v[ 1 ] ))), 1 , n)
356+ ($ fp)(v, result, $ (op== :+ ? :(zero (first (v))) : :(one (first (v )))), first ( indices (v, 1 )) , n)
385357 return result
386358 end
387359
0 commit comments