Thanks, looks good.

Nice to see reusable code like 'trivial' and interesting case-select 
code with an adverb selector like:

> reduceStep=: reduce0`reduce1`]@.(2<. {.@{.) NonTrivial


Small step, RREF with less characters:

RREF =: {.&>@ (reduceStep@}.&.>^:(1<#&>)^:a:@<@reduceStep)&.|. @ REF


I agree with your final note.

  *./0={.y

handles both

   i.0   and i.0 0

In Haskell you need the first pattern

rowEchelonForm [] = []

  to handle []

The final pattern

rowEchelonForm zs@([]:_) = zs

handles
  [[]]

If you leave out the first pattern, you get with a stupid argument like []

>  rowEchelonForm []
*** Exception: /rref.hs:(62,1)-(69,29): Non-exhaustive patterns in function 
rowEchelonForm




On 22-04-12 20:16, Raul Miller wrote:
> Here's an attempt at making this code more "J-ish".  Mostly, I have
> been assigning names to blocks (instead of allowing anonymous blocks).
>
> I need better names, though.  ref0N is not a very evocative name.
>
>
> trivial=: 0 *./ .= {.
> NonTrivial=: ^:(0 = trivial)
>
> refN=: (], 0,. [:REF 1 1}. [ - {."1@[ */ ]) (%{.)@{.
> ref00=: 0,. [:REF }."1
> ref0N=: [:REF (}.,~ {. + ({.@#~ 0 ~: {."1))
> ref0=: ref0N`ref00@.(trivial@:|:)
> REF=: refN`ref0@.(0 = {.@{.)NonTrivial
>
> reduce0=: {."1,. [: reduceStep }."1
> reduce1=: {., 0 ,. }."1@}.@(- ({."1 */ {.))
> reduceStep=: reduce0`reduce1`]@.(2<. {.@{.) NonTrivial
>
> RREF =: ([:{.&>  (reduceStep@}.&.>^:(1<#&>)^:a:@<@reduceStep))&.|. @ REF
>
> Note that I have eliminated the code corresponding to
>
> if. 0=#y do. i.0 0 return. end.
>
> since this case never happens -- it is handled by
>
> if. *./0={.y do. y return. end.
>
> FYI,
>

-- 
Met vriendelijke groet,
@@i = Arie Groeneveld

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to