I would just write the loop explicitly:

julia> function meanpositives(mat::Matrix)
           nc = size(mat,2)
           sums = zeros(nc)
           counts = zeros(nc)
           for c in 1:nc
               for r in 1:size(mat,1)
                   v = mat[r,c]
                   if v > 0
                       sums[c] += v
                       counts[c] += 1.0
                   end
               end
           end
           Float64[(counts[i]>0 ? sums[i]/counts[i] : 0.0) for i in 1:nc]
       end
meanpositives (generic function with 1 method)

julia> x
3x3 Array{Float64,2}:
 10.0  5.0  0.0
  5.0  0.0  0.0
  0.0  0.0  0.0

julia> meanpositives(x)
3-element Array{Float64,1}:
 7.5
 5.0
 0.0


On Tue, Jul 28, 2015 at 12:01 PM, Stefan Karpinski <[email protected]>
wrote:

> You mean quicker as in faster or as in easier? Using indexing is probably
> easiest but not fastest:
>
> julia> M = randn(5,5)
> 5x5 Array{Float64,2}:
>  -1.51134     1.2331    -0.186083   0.412282  -1.13114
>  -0.0411132   0.124684   0.377426   0.622427  -0.278162
>   0.788182   -0.834092   1.09506    1.45196   -0.620717
>   1.45856    -0.889277  -0.768049  -0.95953   -0.340098
>   1.69666     0.695566   0.706905   0.63089    0.958474
>
> julia> mean(M[M .> 0])
> 0.8751552351448673
>
>
> If you want the fastest, loop through the matrix and keep totals and
> counts:
>
> julia> function meanpos(a)
>            t = zero(eltype(a))
>            c = 0
>            for x in a
>                x > 0 || continue
>                t += x
>                c += 1
>            end
>            return t/c
>        end
> meanpos (generic function with 1 method)
>
> julia> meanpos(M)
> 0.8751552351448673
>
>
> This should be fairly efficient for any non-sparse collection.
>
>
> On Tue, Jul 28, 2015 at 11:50 AM, Jude <[email protected]> wrote:
>
>> Hi!
>>
>> Probably a quite basic question but was wondering if someone knows a quick
>> way to get the average of theh positive elements of a matrix, eg, If I have
>> an m*n matrix and want to get the average for each m so have m*1 but only
>> want to work with non-zero elements and ignore the zero elements and
>> negative elements
>>
>> I guess I could using indexing and pull out the indexes corresponding to
>> the positive elements but just wondering if anyone knew quicker ways!
>>
>> Thanks!
>>
>
>

Reply via email to