Dear all,
As our previous email did not get any response, we try again with a
reformulated question!
We are trying to do something which needs an efficient loop over a huge
array, possibly functions such as apply and related (tapply,
lapply...?), but can't really understand syntax and examples in
practice...i.e. cant' make it work.
to be more specific:
we are trying to apply a mask to a 3D array.
By this I mean that when "overlaying" [i.e. comparing element by
element]
the mask on to the array the mask should change array elements according to
the values of both array and mask elements
the mask has two values: 1 and 10.
the array elements have 3 values: 0, 1, or 10
sticking for the moment to the single 2d array case
for example:
[A= array] 10 0 10 1 10 0
1 10 1 0 0 10
[ M=mask] 1 10 10 1 1 1
10 1 1 1 10 10
I would like the array elements to:
a) IF A(ij) !=10 and Mij = 1
leave A(ij) unchanged
b) IF A(ij) != 10 and M(ij) =10
change A(ij) to M(ij) i.e mask value (10)
c)IF A(ij) = 10 and M(ij) = 10
leave (Aij) unchanged
d) IF A(ij) = 10 and M(ij) !=10
replace A(ij) with the majority value in the 8-neighborhood
(or whatever if it is an edge element) BUT ignoring 10s in this
neighborhood (i.e. with either 1 or 0, whichever is in majority)
because the array is 3d I would like to repeat the thing with all the k
elements (2d sub-arrays) of the array in question, using the same mask for
al k elements
Would you be able to suggest a strategy to do this?
thanks very much
Alessandro and Sander.
I'll give it half a crack: Steps a through c can be done via nested ifelse(), treating A and M as vectors (as they really are). Step d is the hard one. I'd write a simple Fortran code and use .Fortran() for that. I don't see how any of the *apply() functions can help here, as your operations are element-wise, not dimension-wise. Andy> From: Sander Oom > > Dear all, > > As our previous email did not get any response, we try again with a > reformulated question! > > We are trying to do something which needs an efficient loop > over a huge > array, possibly functions such as apply and related (tapply, > lapply...?), but can't really understand syntax and examples in > practice...i.e. cant' make it work. > > to be more specific: > we are trying to apply a mask to a 3D array. > By this I mean that when "overlaying" [i.e. comparing element > by element] > the mask on to the array the mask should change array > elements according to > the values of both array and mask elements > > the mask has two values: 1 and 10. > > the array elements have 3 values: 0, 1, or 10 > > sticking for the moment to the single 2d array case > > for example: > [A= array] 10 0 10 1 10 0 > 1 10 1 0 0 10 > > [ M=mask] 1 10 10 1 1 1 > 10 1 1 1 10 10 > > I would like the array elements to: > > a) IF A(ij) !=10 and Mij = 1 > leave A(ij) unchanged > > b) IF A(ij) != 10 and M(ij) =10 > change A(ij) to M(ij) i.e mask value (10) > > c)IF A(ij) = 10 and M(ij) = 10 > leave (Aij) unchanged > > d) IF A(ij) = 10 and M(ij) !=10 > replace A(ij) with the majority value in the > 8-neighborhood > > (or whatever if it is an edge element) BUT ignoring 10s in this > neighborhood (i.e. with either 1 or 0, whichever is in majority) > > because the array is 3d I would like to repeat the thing with > all the k > elements (2d sub-arrays) of the array in question, using the > same mask for > al k elements > > Would you be able to suggest a strategy to do this? > > thanks very much > > Alessandro and Sander. > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html > >
> From: "Liaw, Andy" <andy_liaw at merck.com> > Date: Tue, 23 Nov 2004 12:28:48 -0500 > > I'll give it half a crack: > > Steps a through c can be done via nested ifelse(), treating A and M as > vectors (as they really are). Step d is the hard one. I'd write a simple > Fortran code and use .Fortran() for that. > > I don't see how any of the *apply() functions can help here, as your > operations are element-wise, not dimension-wise. > > Andy >The original message mentions that the value 10 is actually "NODATA", and if one recodes 10 as NA, steps a) to c) become trivial, namely: A[A == 10] <- NA M[M == 10] <- NA return(A + M - 1) Then if step d) is performed first (i.e. appropriate values in A are replaced by the 'most common neighbour' [perhaps using round(mean(.., na.rm=T))] this still works, but would have to be repeated for each replication (the third dimension). Ray Brownrigg> > From: Sander Oom > > > > Dear all, > > > > As our previous email did not get any response, we try again with a > > reformulated question! > > > > We are trying to do something which needs an efficient loop > > over a huge > > array, possibly functions such as apply and related (tapply, > > lapply...?), but can't really understand syntax and examples in > > practice...i.e. cant' make it work. > > > > to be more specific: > > we are trying to apply a mask to a 3D array. > > By this I mean that when "overlaying" [i.e. comparing element > > by element] > > the mask on to the array the mask should change array > > elements according to > > the values of both array and mask elements > > > > the mask has two values: 1 and 10. > > > > the array elements have 3 values: 0, 1, or 10 > > > > sticking for the moment to the single 2d array case > > > > for example: > > [A= array] 10 0 10 1 10 0 > > 1 10 1 0 0 10 > > > > [ M=mask] 1 10 10 1 1 1 > > 10 1 1 1 10 10 > > > > I would like the array elements to: > > > > a) IF A(ij) !=10 and Mij = 1 > > leave A(ij) unchanged > > > > b) IF A(ij) != 10 and M(ij) =10 > > change A(ij) to M(ij) i.e mask value (10) > > > > c)IF A(ij) = 10 and M(ij) = 10 > > leave (Aij) unchanged > > > > d) IF A(ij) = 10 and M(ij) !=10 > > replace A(ij) with the majority value in the > > 8-neighborhood > > > > (or whatever if it is an edge element) BUT ignoring 10s in this > > neighborhood (i.e. with either 1 or 0, whichever is in majority) > > > > because the array is 3d I would like to repeat the thing with > > all the k > > elements (2d sub-arrays) of the array in question, using the > > same mask for > > al k elements > > > > Would you be able to suggest a strategy to do this? > > > > thanks very much > > > > Alessandro and Sander.