NB. Some matrix techniques expressed in the J NB. programming notation. NB. Identity I =: =/~ i. 3 NB. Dot Product dp =: +/ @: * NB. Tensor Product tp =: dyad def '((3 1 & $) x.) (+/ . *) (1 3 & $) y.' NB. Cross Product wx =: monad def '3 3 $ 0 1 _1 _1 0 1 1 _1 0 * 0 2 1 2 0 0 1 0 0 { y.' xub =: adverb def '3 3 $ 0 1 _1 _1 0 1 1 _1 0 * 0 2 1 2 0 0 1 0 0 { m.' x =: adverb def '(wx m.) & (+/ . *)' x =: adverb def 'm. xub & (+/ . *)' x =: adverb def '(3 3 $ 0 1 _1 _1 0 1 1 _1 0 * 0 2 1 2 0 0 1 0 0 { m.) & (+/ . *)' NB. Identities NB. (a +/ . * I) -: a a =: +/~ i. 3 NB. (u +/ . * (v tp w)) -: (u dp v)*w 'u v w' =: I 'u v w' =: 3 3 $ 1 2 3 4 5 6 7 8 9 NB. (u +/ . * w xub) -: - w x u NB. Translation T =: monad def '(I,.0) , y. , 1' NB. Rotation NB. L - rotation axis line NB. w - unit vector parallel to L NB. Q - point on L NB. o - angle of rotation R =: dyad def '((2 o. y.)*I) + ((1 - 2 o. y.) * x. tp x.) + (1 o. y.)* wx x.' R =: dyad def '((2 o. y.)*I) + ((1 - 2 o. y.) * x. tp x.) + (1 o. y.)* x. xub' rot =: conjunction def '((((2 o. n.)*I) + ((1 - 2 o. n.) * m. tp m.) + (1 o. n.)* m. xub),.0),(y. - y. +/ . * ((2 o. n.)*I) + ((1 - 2 o. n.) * m. tp m.) + (1 o. n.)* m. xub),1' rot =: conjunction define r =. ((2 o. n.)*I) + ((1 - 2 o. n.) * m. tp m.) + (1 o. n.)* m. xub (r,.0),(y. - y. +/ . * r),1 ) NB. Example: (1 0 0 rot (o. 1r2)) 0 0 0 (0 1 0 rot (o. 1r2)) 0 0 0 (0 0 1 rot (o. 1r2)) 0 0 0 NB. Scaling NB. Q - scaling origin NB. c - scaling factor NB. w - unit vector parallel to scaling direction NB. Uniform scaling S =: dyad def '((y.*I),.0) , ((1-y.)*x.) , 1' NB. Nonuniform scaling