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