Sometimes it helps to inspect intermediate results. With recursion, though, it can be a bit tricky for a casual observer to see the intermediate results. With that in mind, here's what I am seeing for your example:
a1=: (calcU calcL) saveAA a2=: (calcU calcL) a1 a3=: (calcU calcL) a2 A4=: ((({.@[ ,: ]) ,&.:(|."1) a3"_) calcL) a2 A5=: ((({.@[ ,: ]) ,&.:(|."1) A4"_) calcL) a1 A6=: ((({.@[ ,: ]) ,&.:(|."1) A5"_) calcL) saveAA a1, a2 and a3 are progressively smaller square matrices (2x2, 1x1, 0x0) A4, A5 and A6 are progressively larger matrices which are twice as tall as wide. If you could compute them in reverse order it might have made sense to make it twice as wide as tall (with intermediate lu side by side instead of interleave stacked)? A6 is the same as lumain saveAA I should go back and re-read km's implementation. But I will note that you can cut code size slightly using some cross hooks: lumain =: (((,:~ {.)~ ,&.:(|."1) $:@calcU) calcL)^:(*@#) lu =: [: (,:~ |:)/ 1 0 2 |: _2 ]\ lumain Anyways, I think your O(n^3) space is largely because all intermediate values from what I have characterized as a (calcU calcL) hook are "pre"-computed and placed on the stack before proceeding with further computations. Thanks, -- Raul On Sun, Jan 12, 2014 at 10:10 PM, Henry Rich <henryhr...@nc.rr.com> wrote: > calcL =: (% {.)@:({."1) > calcU =: (}.@[ - {.@[ *"1 0 ])&:(}."1) > lumain =: ((({.@[ ,: ]) ,&.:(|."1) $:@calcU) calcL)^:(*@#) > lu =: [: (|:@] ,: [)/ 1 0 2 |: _2 ]\ lumain > NB. Half this code is handling joining ragged lists. > NB. Is there a better way? > > saveAA =: 3 3 $ 2 1 4 _4 _1 _11 2 4 _2 > lu saveAA > > 1 0 0 > _2 1 0 > 1 3 1 > > 2 1 4 > 0 1 _3 > 0 0 3 > > I suspect that a vectorized explicit version is a better way to go. This > version has memory requirements of O(n^3). > > Henry Rich > > > On 1/12/2014 9:00 PM, km wrote: >> >> Verb LU below produces the matrices L and U of the LU decomposition of a >> square matrix A. L is lower triangular, U is upper triangular, and A is L >> +/ . * U . >> >> Should one attempt a tacit version? >> >> eye =: =@i.@] NB. eye 3 is a 3 by 3 identity matrix >> >> rop =: 3 : 0 NB. row op: subtract c times row i0 from row i1 >> : >> 'i1 c i0' =. x >> ( (i1 { y) - c * i0 { y ) i1 } y >> ) >> >> LU =: 3 : 0 NB. square matrices L and U for y -: L +/ . * U >> m =. # y >> L =. eye(m) >> U =. y >> for_j. i. <: m do. >> p =. (< j , j) { U >> for_i. j + >: i. <: m - j do. >> c =. p %~ (< i , j) { U >> L =. c (< i , j) } L >> U =. (i, c, j) rop U >> end. >> end. >> L ,: U >> ) >> >> saveAA >> 2 1 4 >> _4 _1 _11 >> 2 4 _2 >> >> LU saveAA >> 1 0 0 >> _2 1 0 >> 1 3 1 >> >> 2 1 4 >> 0 1 _3 >> 0 0 3 >> >> saveAA -: +/ . */ LU saveAA >> 1 >> >> --Kip Murray >> >> Sent from my iPad >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm