RE: Magnitude of Vector

*To*: mathgroup at smc.vnet.net*Subject*: [mg19415] RE: [mg19339] Magnitude of Vector*From*: "Ersek, Ted R" <ErsekTR at navair.navy.mil>*Date*: Mon, 23 Aug 1999 13:57:23 -0400*Sender*: owner-wri-mathgroup at wolfram.com

Ed McBride wrote: ---------------------- Was doing some stuff that required 3-D vectors. Found Dot and Cross, but couldn't find a primitive operator for Magnitude. Is there one? If not, there definitely should be. --------------------- No it isn't built-in, and you have a good point. Until it is a built-in function the following should do it quite efficiently, and even post messages for invalid arguments. It also works for vectors of any dimension (not only 3D). I included the part about /;(Length[v]=!=0) so that Magnitude[{}] would be undefined as I think it should. --------------------- In[1]:= Magnitude::vect="Mag is only defined for vectors. The expression `1` is not a vector."; Magnitude[v_?VectorQ]/;(Length[v]=!=0):=Sqrt[Plus@@(v^2)]; Magnitude[expr_]/;Message[Magnitude::vect,expr]:="Never get here"; Magnitude[_,more__]/;Message[Magnitude::argx,Magnitude,Length[{more}]+1]:="N ever get here"; In[5]:= Magnitude[{w,x,y,z}] Out[5]= Sqrt[w^2 + x^2 + y^2 + z^2] In[6]:= Magnitude[a+b] Magnitude::vect: Mag is only defined for vectors. The expression a+b is not a vector. Out[6]= Magnitude[a + b] In[7]:= Magnitude[{x,y,z},{a,b,c}] Magnitude::argx: Magnitude called with 2 arguments; 1 argument is expected. Out[7]= Magnitude[{x, y, z}, {a, b, c}] Notice when Magnitude gets invalid input a message is posted and the expression is returned unevaluated. For the case when more than one argument is given I used one of the General::tag messages found in the (messages.m) file. For the case where the argument isn't a vector I defined my own message (Message::vect). You could make this a little more complicated and ensure a CompiledFunction is used when possible. I tried that, but it the speed advantage was only about 25% for very long vectors. --------------------- Regards, Ted Ersek For Mathematica Tips, Tricks see http://www.dot.net.au/~elisha/ersek/Tricks.html