@@ -1031,28 +1031,16 @@ function repmat(a::AbstractVector, m::Int)
1031
1031
end
1032
1032
1033
1033
sub2ind (dims) = 1
1034
- sub2ind (dims, i:: Integer ) = int (i)
1035
- sub2ind (dims, i:: Integer , j:: Integer ) = sub2ind (dims, int (i), int (j))
1036
- sub2ind (dims, i:: Int , j:: Int ) = (j- 1 )* dims[1 ] + i
1037
- sub2ind (dims, i0:: Integer , i1:: Integer , i2:: Integer ) = sub2ind (dims, int (i0),int (i1),int (i2))
1038
- sub2ind (dims, i0:: Int , i1:: Int , i2:: Int ) =
1039
- i0 + dims[1 ]* ((i1- 1 ) + dims[2 ]* (i2- 1 ))
1040
- sub2ind (dims, i0:: Integer , i1:: Integer , i2:: Integer , i3:: Integer ) =
1041
- sub2ind (dims, int (i0),int (i1),int (i2),int (i3))
1042
- sub2ind (dims, i0:: Int , i1:: Int , i2:: Int , i3:: Int ) =
1043
- i0 + dims[1 ]* ((i1- 1 ) + dims[2 ]* ((i2- 1 ) + dims[3 ]* (i3- 1 )))
1044
-
1045
- function sub2ind (dims, I:: Integer... )
1046
- ndims = length (dims)
1047
- index = int (I[1 ])
1048
- stride = 1
1049
- for k= 2 : ndims
1050
- stride = stride * dims[k- 1 ]
1051
- index += (int (I[k])- 1 ) * stride
1034
+ stagedfunction sub2ind {N} (dims:: NTuple{N,Integer} ,I:: Integer... )
1035
+ length (I) == N || throw (ArgumentError (" number of subscripts should match length of dims" ))
1036
+ ex= :(I[$ N])
1037
+ for k= N- 1 : - 1 : 1
1038
+ ex= :(I[$ k]+ dims[$ k]* ($ ex- 1 ))
1052
1039
end
1053
- return index
1040
+ :( Int ( $ ex))
1054
1041
end
1055
1042
1043
+
1056
1044
function sub2ind {T<:Integer} (dims:: Array{T} , sub:: Array{T} )
1057
1045
ndims = length (dims)
1058
1046
ind = sub[1 ]
@@ -1067,31 +1055,18 @@ end
1067
1055
sub2ind {T<:Integer} (dims, I:: AbstractVector{T} ...) =
1068
1056
[ sub2ind (dims, map (X-> X[i], I)... ):: Int for i= 1 : length (I[1 ]) ]
1069
1057
1070
- function ind2sub (dims:: (Integer,Integer...) , ind:: Int )
1071
- ndims = length (dims)
1072
- stride = dims[1 ]
1073
- for i= 2 : ndims- 1
1074
- stride *= dims[i]
1075
- end
1076
1058
1077
- sub = ()
1078
- for i= (ndims- 1 ): - 1 : 1
1079
- rest = rem (ind- 1 , stride) + 1
1080
- sub = tuple (div (ind - rest, stride) + 1 , sub... )
1081
- ind = rest
1082
- stride = div (stride, dims[i])
1059
+ ind2sub (dims:: () , ind:: Integer ) = ind== 1 ? () : throw (BoundsError ())
1060
+ stagedfunction ind2sub {N} (dims:: NTuple{N,Integer} , ind:: Int )
1061
+ subsyms = [symbol (" i$k " ) for k= 1 : N]
1062
+ subex = Expr (:block ,[:($ (subsyms[k])= rem (ind,dims[$ k])+ 1 ;ind= div (ind,dims[$ k])) for k= 1 : N- 1 ]. .. )
1063
+ quote
1064
+ ind-= 1
1065
+ $ (subex)
1066
+ $ (subsyms[N]) = ind+ 1
1067
+ $ (Expr (:tuple ,subsyms... ))
1083
1068
end
1084
- return tuple (ind, sub... )
1085
1069
end
1086
-
1087
- ind2sub (dims:: (Integer...) , ind:: Integer ) = ind2sub (dims, int (ind))
1088
- ind2sub (dims:: () , ind:: Integer ) = ind== 1 ? () : throw (BoundsError ())
1089
- ind2sub (dims:: (Integer,) , ind:: Int ) = (ind,)
1090
- ind2sub (dims:: (Integer,Integer) , ind:: Int ) =
1091
- (rem (ind- 1 ,dims[1 ])+ 1 , div (ind- 1 ,dims[1 ])+ 1 )
1092
- ind2sub (dims:: (Integer,Integer,Integer) , ind:: Int ) =
1093
- (rem (ind- 1 ,dims[1 ])+ 1 , div (rem (ind- 1 ,dims[1 ]* dims[2 ]), dims[1 ])+ 1 ,
1094
- div (rem (ind- 1 ,dims[1 ]* dims[2 ]* dims[3 ]), dims[1 ]* dims[2 ])+ 1 )
1095
1070
ind2sub (a:: AbstractArray , ind:: Integer ) = ind2sub (size (a), Int (ind))
1096
1071
1097
1072
function ind2sub {T<:Integer} (dims:: (Integer,Integer...) , ind:: AbstractVector{T} )
@@ -1499,4 +1474,3 @@ function randsubseq!(S::AbstractArray, A::AbstractArray, p::Real)
1499
1474
end
1500
1475
1501
1476
randsubseq {T} (A:: AbstractArray{T} , p:: Real ) = randsubseq! (T[], A, p)
1502
-
0 commit comments