glue_cross_meat.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2010 NICTA and the authors listed below
00002 // http://nicta.com.au
00003 // 
00004 // Authors:
00005 // - Conrad Sanderson (conradsand at ieee dot org)
00006 // 
00007 // This file is part of the Armadillo C++ library.
00008 // It is provided without any warranty of fitness
00009 // for any purpose. You can redistribute this file
00010 // and/or modify it under the terms of the GNU
00011 // Lesser General Public License (LGPL) as published
00012 // by the Free Software Foundation, either version 3
00013 // of the License or (at your option) any later version.
00014 // (see http://www.opensource.org/licenses for more info)
00015 
00016 
00017 
00018 //! \addtogroup glue_cross
00019 //! @{
00020 
00021 
00022 
00023 template<typename T1, typename T2>
00024 inline
00025 void
00026 glue_cross::apply(Mat<typename T1::elem_type>& out, const Glue<T1, T2, glue_cross>& X)
00027   {
00028   arma_extra_debug_sigprint();
00029   
00030   typedef typename T1::elem_type eT;
00031   
00032   const unwrap<T1> A_tmp(X.A);
00033   const unwrap<T2> B_tmp(X.B);
00034   
00035   const Mat<eT>& A = A_tmp.M;
00036   const Mat<eT>& B = B_tmp.M;
00037   
00038   arma_debug_check( ((A.n_elem != 3) || (B.n_elem != 3)), "cross(): input vectors must have 3 elements" );
00039   
00040   out.set_size(A.n_rows, A.n_cols);
00041   
00042         eT* out_ptr = out.memptr();
00043   const eT* A_ptr   = A.memptr();
00044   const eT* B_ptr   = B.memptr();
00045   
00046   // out_ptr[0] = A_ptr[1]*B_ptr[2] - A_ptr[2]*B_ptr[1];
00047   // out_ptr[1] = A_ptr[2]*B_ptr[0] - A_ptr[0]*B_ptr[2];
00048   // out_ptr[2] = A_ptr[0]*B_ptr[1] - A_ptr[1]*B_ptr[0];
00049   
00050   const eT ax = A_ptr[0];
00051   const eT ay = A_ptr[1];
00052   const eT az = A_ptr[2];
00053   
00054   const eT bx = B_ptr[0];
00055   const eT by = B_ptr[1];
00056   const eT bz = B_ptr[2];
00057   
00058   out_ptr[0] = ay*bz - az*by;
00059   out_ptr[1] = az*bx - ax*bz;
00060   out_ptr[2] = ax*by - ay*bx;
00061   }
00062 
00063 
00064 
00065 //! @}