El viernes, 21 de febrero de 2014 08:31:20 UTC-6, Ivar Nesje escribió:
>
> There is an open issue for adding a filter/if to a list comprehension.
> https://github.com/JuliaLang/julia/issues/550
>
> for now you will need to do
> L = 5
> r= rand(L, L)
> where = (Int,Int)[]
> for x = 1:L, y= 1:L
> if r[x,y] < 0.5
> push!(where, (x,y))
> end
> end
>
> Preferably you will wrap that in a function, so that you do not use global
> variables, as they are currently slow.
>
OK, thanks.
The version in a function can be profiled with `@time`.
How can I profile the version with globals (just to convince myself!)?
David.
>
> Ivar
>
> kl. 14:45:45 UTC+1 fredag 21. februar 2014 skrev David P. Sanders følgende:
>>
>> Hi,
>>
>> Given a matrix, which will be large (say 10^5 x 10^5), I need to extract
>> the list of indices (i.e. the pairs (x,y) of positions) of those places in
>> the matrix
>> where the value stored satisfies a certain condition. For a minimal
>> example, the condition can just be that the value is greater than 0.5.
>>
>> The code below achieves this, but seems inefficient, since it constructs
>> the whole array of indices, even though there may be only a few places
>> where the condition is satisfied.
>> Is there a more efficient way of doing this?
>> Is there an "if" clause in an array comprehension? -- adding this to the
>> definition of 'indices' would seem to do what I want, but I have not found
>> this syntax in the manual for arrays.
>>
>> Thanks,
>> David.
>>
>>
>> julia> L = 5
>> 5
>>
>> julia> r= rand(L, L)
>> 5x5 Array{Float64,2}:
>> 0.705585 0.534721 0.158935 0.343876 0.624299
>> 0.0624089 0.525414 0.131139 0.590439 0.554686
>> 0.190085 0.557751 0.591916 0.485526 0.6307
>> 0.365398 0.943102 0.575083 0.858705 0.105142
>> 0.047924 0.116424 0.756757 0.576293 0.461547
>>
>> julia> indices = [(x,y) for x in 1:L, y in 1:L]
>> 5x5 Array{(Any,Any),2}:
>> (1,1) (1,2) (1,3) (1,4) (1,5)
>> (2,1) (2,2) (2,3) (2,4) (2,5)
>> (3,1) (3,2) (3,3) (3,4) (3,5)
>> (4,1) (4,2) (4,3) (4,4) (4,5)
>> (5,1) (5,2) (5,3) (5,4) (5,5)
>>
>> julia> where = indices[r .> 0.5]
>> 14-element Array{(Any,Any),1}:
>> (1,1)
>> (1,2)
>> (2,2)
>> (3,2)
>> (4,2)
>> (3,3)
>> (4,3)
>> (5,3)
>> (2,4)
>> (4,4)
>> (5,4)
>> (1,5)
>> (2,5)
>> (3,5)
>>
>