 
 
 
 
 
 
Re: Generating Two Unit Orthogonal Vectors (correction)
- To: mathgroup at smc.vnet.net
- Subject: [mg36428] Re: Generating Two Unit Orthogonal Vectors (correction)
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Fri, 6 Sep 2002 03:17:01 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
OrthogonalUnitVectors  that I sent a few minutes ago doesn't do what I
thought it would.
After making either definition below I get the following:
In[2]:=
   s1=OrthogonalUnitVectors[{1,0,1/2,1,0},{0,1,-1,1/2,2}]
Out[2]=
    {{0, -2/Sqrt[5], 0, 0, 1/Sqrt[5]}, {-2/3, -1/3, 0, 2/3, 0}, {-1/3, 2/3,
2/3, 0, 0}}
The dot products below aren't zero, so the vectors aren't orthogonal.  What
went wrong?
In[3]:= 
   Part[s1,1].Part[s1,2]
Out[3]=
   2/(3*Sqrt[5])
In[4]:= 
   Part[s1,1].Part[s1,3]
Out[3]=
   -4/(3*Sqrt[5])
--------------
> Hugh Goyder and David Park gave a most elegant function to find two
> vectors that are orthogonal to one vector in 3D.  The key to coming up
> with the elegant solution is an understanding of Mathematica's NullSpace
> function.  We can easily make the version from Hugh and David much more
> general with the version below.
> -------------
> OrthogonalUnitVectors[vect__?VectorQ]:= 
>     #/Sqrt[#.#]&/@NullSpace[{vect}]
> 
> -------------
> The version above will give a set of unit orthogonal vectors if given any
> number of vectors in any dimension.  
> So besides giving it a 3D vector we can give it the following:
>    OrthogonalUnitVectors[{2,1,0,-1,1}]
>    or
>    OrthogonalUnitVectors[{0,1,0,1/2,1},{1,0,-1,1/2}]
> 
> ------------
> But the short version above isn't very robust.
> (1)  Clear[x,y,z];NullSpace[{{x,y,z}}]
>        returns two vectors orthogonal to {x,y,z}, but the two vectors
> NullSpace returns aren't orthogonal to each other. 
>        So (OrthogonalUnitVectors) should only work with numeric vectors.
> 
> (2)  We should ensure all the vectors have the same dimension and length
> >1.
> 
> I give a less concise version below that corrects these problems.
> ------------
> 
> OrthogonalUnitVectors[vect__?(VectorQ[#,NumericQ]&)]/;
>         (SameQ@@Length/@{vect})&&(Length[First[{vect}]]>1):= 
>     #/Sqrt[#.#]&/@NullSpace[{vect}]
> 
> --------------
> Regards,
>    Ted Ersek
>    Get Mathematica tips, tricks from
>    http://www.verbeia.com/mathematica/tips/Tricks.html
> 

