Other options, both faster: int(x.*x + y.*y .< radius*radius) [(x[k]*x[k] + y[k]*y[k] < r*r)?1:0 for k=1:length(x)]
Den söndagen den 8:e juni 2014 kl. 02:02:56 UTC+2 skrev Zahirul ALAM: > > thanks guys for all of these :) > > On Saturday, 7 June 2014 14:25:08 UTC-4, David Einstein wrote: >> >> It makes sense now. The ternary operator only evaluates one branch, >> while a function would force both to be evaluated. So the answer to the >> original question should be >> >> inside_disc(x,y,radius) = ifelse((sqrt(x.^2 .+ y.^2) .< radius), 1 , 0) >> >> This should be faster than the map version. >> >> Amazingly (at least to me), the ifelse version is only 10% faster than >> the map version when processing million item vectors of floats, and >> generates just a slight amount more garbage. >> >> On Saturday, June 7, 2014 1:05:20 PM UTC-4, Stefan Karpinski wrote: >>> >>> That's because ifelse is just a function, not an operator with special >>> syntax. The ternary operator is just a one-line form of the if-else and >>> requires the condition to be a single boolean value. It is a genuine >>> control flow construct, not a function. >>> >>> >>> On Fri, Jun 6, 2014 at 11:54 PM, David Einstein <[email protected]> >>> wrote: >>> >>>> It looks like you have vectorized ifelse, the operator version just >>>> doesn't work. This code is on line 379 of operators.jl >>>> >>>> function ifelse(c::AbstractArray{Bool}, x, y) >>>> reshape([ifelse(ci, x, y) for ci in c], size(c)) >>>> end >>>> >>>> If I do >>>> >>>> ifelse((1:10 .< 5) , 1 , 0) >>>> >>>> then everything works. >>>> >>>> however >>>> >>>> (1:10 .< 5) ? 1 : 0 >>>> >>>> does not. I'm not sure why. >>>> >>>> Also it appears that ifelse is not automatically imported like the rest >>>> of the operators from base are. >>>> >>>> >>>> On Friday, June 6, 2014 10:58:10 PM UTC-4, Stefan Karpinski wrote: >>>> >>>>> We should probably vectorize the ifelse function. >>>>> >>>>> On Jun 6, 2014, at 10:51 PM, David Einstein <[email protected]> wrote: >>>>> >>>>> sqrt(x.^2 .+ y.^2) .< radius >>>>> is a vector of booleans >>>>> >>>>> ?: >>>>> expects a boolean >>>>> >>>>> you probably want something like: >>>>> >>>>> inside_disc(x,y,radius) = map(good -> good ? 1 : 0, >>>>> sqrt(x.^2+y.^2).<radius) >>>>> >>>>> >>>>> >>>>> On Friday, June 6, 2014 10:18:36 PM UTC-4, Zahirul ALAM wrote: >>>>>> >>>>>> When I pass two arrays the function returns: >>>>>> >>>>>> type: non-boolean (BitArray{1}) used in boolean context while loading >>>>>> In[10], in expression starting on line 1 >>>>>> >>>>>> >>>>>> I have modified the function to address the element wise operation as >>>>>> follows: >>>>>> >>>>>> >>>>>> inside_disc(x,y,radius) = sqrt(x.^2 .+ y.^2) .< radius ? 1 : 0 >>>>>> >>>>>> seems to me that the error is being thrown by .< operation. What am I >>>>>> missing? >>>>>> >>>>>> >>>>>> On Friday, 6 June 2014 20:34:22 UTC-4, Miguel Bazdresch wrote: >>>>>>> >>>>>>> I'm not sure I understand the question. Do you mean something like >>>>>>> this? >>>>>>> >>>>>>> inside_disc(x,y,radius) = sqrt(x^2+y^2)<radius ? 1 : 0 >>>>>>> >>>>>>> -- mb >>>>>>> >>>>>>> >>>>>>> On Fri, Jun 6, 2014 at 8:28 PM, Zahirul ALAM <[email protected]> >>>>>>> wrote: >>>>>>> >>>>>>>> I guess one can do a for loop. But how do I vectorize the code? >>>>>>>> >>>>>>>> >>>>>>>> On Friday, 6 June 2014 20:27:46 UTC-4, Zahirul ALAM wrote: >>>>>>>>> >>>>>>>>> How would one implement a step function like behaviour in julia? >>>>>>>>> In mathematica one can write the following to create a circle with >>>>>>>>> value of >>>>>>>>> 1 within the radius and 0 outside >>>>>>>>> >>>>>>>>> UnitBox[Sqrt[X^2 + Y^2]*0.5/radius]; >>>>>>>>> >>>>>>>>> X and Y are the coordinates. >>>>>>>>> >>>>>>>> >>>>>>> >>>
