> 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.

Give you a logical array which you can use for indexing:
  r.>.5 
and to get the linear indices
  find(r.>.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.

There is no if clause for comprehensions but you can always just write
the loops.

> 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)

-- 

Reply via email to