Hi,
I'd request a BlitzMax built-in feature to slice arrays with more than one dimension; it could work like this:
Could you implement this as BlitzMax built-in feature? That would be really nice.
I'd request a BlitzMax built-in feature to slice arrays with more than one dimension; it could work like this:
Local Arr [ 5 , 5 ] 'Create a 5x5 array Arr = Arr [ .. 10 , .. 10 ] 'Extend it to a 10x10 array Arr = Arr [ 4 .. 6 , 4 .. 6 ] 'Extract the middle four elements in a 2x2 array Arr = Arr [ -8 .. , -3 .. ] 'Append empty elements to the beginning of the array so that it's 10x5 Arr = Arr [ .. 5 , .. 10 ] 'Skip 25 elements in x-axis(first dimension) and append 25 empty elements in y-axis(second dimension)This isn't possible yet. I suggest to add this feature; it'll be usefull, because till now you've to create a new array with same dimensions and then copy the elements if you want to do this. I wrote some functions to perform array slices with arrays with up to 5 dimensions:
Strict Framework brl.blitz Function ArraySliceInt2D [,] ( arr [,] , dim0start , dim0end , dim1start , dim1end ) Local dim0size = dim0end - dim0start Local dim1size = dim1end - dim1start If dim0size <= 0 Or dim1size <= 0 Return EndIf Local val [ dim0size , dim1size ] Local dims [] = arr.Dimensions ( ) If Len dims = 2 Local i0 For Local dim0index = dim0start Until dim0end If dim0index >= 0 And dim0index < dims [ 0 ] Local i1 For Local dim1index = dim1start Until dim1end If dim1index >= 0 And dim1index < dims [ 1 ] val [ i0 , i1 ] = arr [ dim0index , dim1index ] EndIf i1 :+ 1 Next EndIf i0 :+ 1 Next EndIf Return val EndFunction Function ArraySliceInt3D [,,] ( arr [,,] , dim0start , dim0end , dim1start , dim1end , dim2start , dim2end ) Local dim0size = dim0end - dim0start Local dim1size = dim1end - dim1start Local dim2size = dim2end - dim2start If dim0size <= 0 Or dim1size <= 0 Or dim2size <= 0 Return EndIf Local val [ dim0size , dim1size , dim2size ] Local dims [] = arr.Dimensions ( ) If Len dims = 3 Local i0 For Local dim0index = dim0start Until dim0end If dim0index >= 0 And dim0index < dims [ 0 ] Local i1 For Local dim1index = dim1start Until dim1end If dim1index >= 0 And dim1index < dims [ 1 ] Local i2 For Local dim2index = dim2start Until dim2end If dim2index >= 0 And dim2index < dims [ 2 ] val [ i0 , i1 , i2 ] = arr [ dim0index , dim1index , dim2index ] EndIf i2 :+ 1 Next EndIf i1 :+ 1 Next EndIf i0 :+ 1 Next EndIf Return val EndFunction Function ArraySliceInt4D [,,,] ( arr [,,,] , dim0start , dim0end , dim1start , dim1end , dim2start , dim2end , dim3start , dim3end ) Local dim0size = dim0end - dim0start Local dim1size = dim1end - dim1start Local dim2size = dim2end - dim2start Local dim3size = dim3end - dim3start If dim0size <= 0 Or dim1size <= 0 Or dim2size <= 0 Or dim3size <= 0 Return EndIf Local val [ dim0size , dim1size , dim2size , dim3size ] Local dims [] = arr.Dimensions ( ) If Len dims = 4 Local i0 For Local dim0index = dim0start Until dim0end If dim0index >= 0 And dim0index < dims [ 0 ] Local i1 For Local dim1index = dim1start Until dim1end If dim1index >= 0 And dim1index < dims [ 1 ] Local i2 For Local dim2index = dim2start Until dim2end If dim2index >= 0 And dim2index < dims [ 2 ] Local i3 For Local dim3index = dim3start Until dim3end If dim3index >= 0 And dim3index < dims [ 3 ] val [ i0 , i1 , i2 , i3 ] = arr [ dim0index , dim1index , dim2index , dim3index ] EndIf i3 :+ 1 Next EndIf i2 :+ 1 Next EndIf i1 :+ 1 Next EndIf i0 :+ 1 Next EndIf Return val EndFunction Function ArraySliceInt5D [,,,,] ( arr [,,,,] , dim0start , dim0end , dim1start , dim1end , dim2start , dim2end , dim3start , dim3end , dim4start , dim4end ) Local dim0size = dim0end - dim0start Local dim1size = dim1end - dim1start Local dim2size = dim2end - dim2start Local dim3size = dim3end - dim3start Local dim4size = dim4end - dim4start If dim0size <= 0 Or dim1size <= 0 Or dim2size <= 0 Or dim3size <= 0 Or dim4size <= 0 Return EndIf Local val [ dim0size , dim1size , dim2size , dim3size , dim4size ] Local dims [] = arr.Dimensions ( ) If Len dims = 5 Local i0 For Local dim0index = dim0start Until dim0end If dim0index >= 0 And dim0index < dims [ 0 ] Local i1 For Local dim1index = dim1start Until dim1end If dim1index >= 0 And dim1index < dims [ 1 ] Local i2 For Local dim2index = dim2start Until dim2end If dim2index >= 0 And dim2index < dims [ 2 ] Local i3 For Local dim3index = dim3start Until dim3end If dim3index >= 0 And dim3index < dims [ 3 ] Local i4 For Local dim4index = dim4start Until dim4end If dim4index >= 0 And dim4index < dims [ 4 ] val [ i0 , i1 , i2 , i3 , i4 ] = arr [ dim0index , dim1index , dim2index , dim3index , dim4index ] EndIf i4 :+ 1 Next EndIf i3 :+ 1 Next EndIf i2 :+ 1 Next EndIf i1 :+ 1 Next EndIf i0 :+ 1 Next EndIf Return val EndFunction
Could you implement this as BlitzMax built-in feature? That would be really nice.