I updated that code but forgot to copy it over. The second function should be defined as
function sdifsums(v::Vector) [signedsum(v,j) for j in uint(0:(2^length(v) - 1))] end On Tuesday, April 1, 2014 2:51:13 PM UTC-5, Douglas Bates wrote: > > In > > http://nbviewer.ipython.org/gist/dmbates/9746197 > > I describe randomization tests for a completely randomized design and how > the 'combinations' iterator makes evaluating the complete randomization > distribution so easy, up to the point where the combinatorial complexity > makes things too slow. > > Another type of randomization test applied to a paired design is based on > the sum of the observed differences between pairs. The observed difference > is compared to the population of sums obtained by assigning arbitrary signs > to the observed differences. If the means of the two groups were equal the > sum of the observed differences should look similar to this population of > sums because the labels of the two groups would be arbitrary. > > To enumerate the sums of k differences with all possible combinations of > signs I need to iterate over the 2^k possible subsets of signs to flip. My > guess is that simply iterating over unsigned ints from 0 to 2^k-1 and > using the bit patterns in these numbers is the way to go. Is there a good > idiom for doing this? Currently I use shifting and masking to determine > the bit pattern > > function signedsum(v::Vector, j::Uint) > s = zero(eltype(v)) > for i in 1:length(v) > s += (j & one(Uint)) == zero(Uint) ? v[i] : -v[i] > j >>= 1 > end > s > end > function sdifsums(v::Vector) > [signedsum(v,j) for j in uint(0:(2^k - 1))] > end > > A test case is > > julia> srand(1234321) > > julia> v = randn(6) > 6-element Array{Float64,1}: > -0.160767 > -1.48275 > -0.384419 > -1.3541 > 1.03842 > -1.16268 > > julia> sdifsums(v) > 64-element Array{Float64,1}: > -3.5063 > -3.18477 > -0.540799 > -0.219266 > -2.73746 > -2.41593 > 0.228038 > 0.549572 > -0.798091 > -0.476557 > ⋮ > 0.476557 > 0.798091 > -0.549572 > -0.228038 > 2.41593 > 2.73746 > 0.219266 > 0.540799 > 3.18477 > 3.5063 > > > Are there any suggestions for a faster or cleaner approach? > >