factorial table expansion Classic List Threaded 3 messages Open this post in threaded view
|

factorial table expansion

 I'm a novice trying to generate factorial table expansion as described below. I am able to do this with many nested for loops, but I seem unable to do this in the proper spirit of lua table and iteration techniques (e.g. the permutations generater in PiL 9.1). The idea is to turn a table of tables like this: factors={         side     = { left = -1, right = 1 },         duration = { short = 200, med = 500, long = 800 },         validity = { valid = 1, invalid = 0 } } into a table containing one table for every possible combination of factor levels, for the above example a table of 2*3*2 entries: conditions = {         { left, short, valid },         { left, short, invalid },         { left, med, valid },         { left, med, invalid },         { left, long, valid },         { left, long, invalid },         { right, short, valid },         { right, short, invalid },         { right, med, valid },         { right, med, invalid },         { right, long, valid },         { right, long, invalid }, } My code below should illustrate what I mean about not being in the spirit of lua! I'd very much appreciate ideas about how to improve this novice effort! Rob ----- function icount(t)  local k, v  local i = 0  for k, v in pairs(t) do   if v then    i = i+1   end  end  return i end function createdesign(design, repsPerBlock, nblocks)  local repsPerBlock = repsPerBlock or 1  local nblocks = nblocks or 1  local nconds = 1  local nlvls = {}  local conds = {}  local nfactor = icount(design)  for f,lvls in pairs(design) do   if lvls then    nlvls[f] = icount(lvls)    nconds = nconds * nlvls[f]   end  end    blocksize = nconds*repsPerBlock  ntrials = blocksize * nblocks  for i = 1, ntrials do   conds[i] = {}  end  ncycles = 1  for f, lvls in pairs(design) do   nlevels = icount(lvls)   trlsPerCyc = blocksize/ncycles   nreps = trlsPerCyc/nlevels   trialsthisblock = 0   while( trialsthisblock < blocksize) do    for cycle = 1, ncycles do     for level in pairs(lvls) do      for rep = 1, nreps do       for block = 1, nblocks do        trialno = (block-1)*blocksize + trialsthisblock+1        value = level        print(trialno,value)        conds[trialno][f] = value       end -- block       trialsthisblock = trialsthisblock+1      end -- rep     end -- level    end -- cycle    ncycles = ncycles * nlevels   end -- trialsthisblock  end -- factor          return conds end -- This mail sent through http://webmail.bangor.ac.uk