Ah, should have realized... ;)

That's 40-200% faster than manually writing the loop, yes.

Thanks, Robert

Den onsdagen den 22:e januari 2014 kl. 11:03:44 UTC+1 skrev Gunnar 
Farnebäck:
>
> You can index both dimensions at once.
>
> matrix[subset, subset]
>
> On Wednesday, January 22, 2014 10:20:21 AM UTC+1, Robert Feldt wrote:
>>
>> I need to repeatedly take subsets of large symmetric matrices 
>> (symmetrically with the same subset indicies for rows and columns) and 
>> first tried like so:
>>
>> function extract_with_getindex(matrix, subset)
>>   matrix[subset,:][:,subset]
>> end
>>
>> which does not scale as well as
>>
>> function extract_in_loop(matrix, subset)
>>   m = length(subset)
>>   res = zeros(m, m)
>>   for i in 1:m
>>     si = subset[i]
>>     for j in 1:m
>>       res[i, j] = matrix[si, subset[j]]
>>     end
>>   end
>>   res
>> end
>>
>> as can be seen in:
>>
>> n = 100, extract_in_loop = 4.792700000000001e-6, extract_with_getindex = 
>> 8.1156e-6, factor faster = 1.6933252655079598
>> n = 1000, extract_in_loop = 1.75141e-5, extract_with_getindex = 
>> 0.0002920263, factor faster = 16.673782837827808
>> n = 10000, extract_in_loop = 9.493099999999999e-5, extract_with_getindex 
>> = 0.0091407535, factor faster = 96.28839367540635
>>
>> from the benchmark code below. If there is some even faster way of 
>> achieving this I'd appreciate pointers/help.
>>
>> Thanks,
>>
>> Robert Feldt
>>
>>
>> # Do some runs to ensure everything is compiled
>> m = random_large_matrix(1000)
>> ss = sort(shuffle(collect(1:1000))[1:10])
>> r1 = extract_in_loop(m, ss)
>> r2 = extract_with_getindex(m, ss)
>>
>> num_features(n) = rand(int(floor(log(n))):int(floor(10*log(n))))
>>
>> NumRepeats = 10
>> for n in [100, 1000, 10000]
>>   times1 = zeros(NumRepeats)
>>   times2 = zeros(NumRepeats)
>>   for i in 1:NumRepeats
>>     matrix = randn(n, n)
>>     ss = sort(shuffle(collect(1:n))[1:num_features(n)])
>>     tic()
>>       res1 = extract_in_loop(matrix, ss)
>>     times1[i] = toq()
>>     tic()
>>       res2 = extract_with_getindex(matrix, ss)
>>     times2[i] = toq()
>>     if res1 != res2
>>       println("Results differ!")
>>     end
>>   end
>>   println("n = $(n), extract_in_loop = $(mean(times1)), 
>> extract_with_getindex = $(mean(times2)), factor faster = 
>> $(mean(times2)/mean(times1))")
>> end
>>
>

Reply via email to