00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00017
00018
00019
00021 template<typename T1>
00022 arma_inline
00023 const eOp<T1, eop_scalar_times>
00024 operator*
00025 (const Base<typename T1::elem_type,T1>& X, const typename T1::elem_type k)
00026 {
00027 arma_extra_debug_sigprint();
00028
00029 return eOp<T1, eop_scalar_times>(X.get_ref(),k);
00030 }
00031
00032
00033
00035 template<typename T1>
00036 arma_inline
00037 const eOp<T1, eop_scalar_times>
00038 operator*
00039 (const typename T1::elem_type k, const Base<typename T1::elem_type,T1>& X)
00040 {
00041 arma_extra_debug_sigprint();
00042
00043 return eOp<T1, eop_scalar_times>(X.get_ref(),k);
00044 }
00045
00046
00047
00049 template<typename T1>
00050 arma_inline
00051 const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>
00052 operator*
00053 (
00054 const Base<typename T1::pod_type, T1>& X,
00055 const std::complex<typename T1::pod_type>& k
00056 )
00057 {
00058 arma_extra_debug_sigprint();
00059
00060 return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X.get_ref(), k);
00061 }
00062
00063
00064
00066 template<typename T1>
00067 arma_inline
00068 const mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>
00069 operator*
00070 (
00071 const std::complex<typename T1::pod_type>& k,
00072 const Base<typename T1::pod_type, T1>& X
00073 )
00074 {
00075 arma_extra_debug_sigprint();
00076
00077 return mtOp<typename std::complex<typename T1::pod_type>, T1, op_cx_scalar_times>('j', X.get_ref(), k);
00078 }
00079
00080
00081
00083 template<typename T1>
00084 arma_inline
00085 const Op<T1, op_htrans2>
00086 operator*
00087 (const typename T1::elem_type k, const Op<T1, op_htrans>& X)
00088 {
00089 arma_extra_debug_sigprint();
00090
00091 return Op<T1, op_htrans2>(X.m, k);
00092 }
00093
00094
00095
00097 template<typename T1>
00098 arma_inline
00099 const Op<T1, op_htrans2>
00100 operator*
00101 (const Op<T1, op_htrans>& X, const typename T1::elem_type k)
00102 {
00103 arma_extra_debug_sigprint();
00104
00105 return Op<T1, op_htrans2>(X.m, k);
00106 }
00107
00108
00109
00111 template<typename T1, typename T2>
00112 arma_inline
00113 const Glue<T1, Op<T2, op_diagmat>, glue_times_diag>
00114 operator*
00115 (const Base<typename T2::elem_type,T1>& X, const Op<T2, op_diagmat>& Y)
00116 {
00117 arma_extra_debug_sigprint();
00118
00119 return Glue<T1, Op<T2, op_diagmat>, glue_times_diag>(X.get_ref(), Y);
00120 }
00121
00122
00123
00125 template<typename T1, typename T2>
00126 arma_inline
00127 const Glue<Op<T1, op_diagmat>, T2, glue_times_diag>
00128 operator*
00129 (const Op<T1, op_diagmat>& X, const Base<typename T1::elem_type,T2>& Y)
00130 {
00131 arma_extra_debug_sigprint();
00132
00133 return Glue<Op<T1, op_diagmat>, T2, glue_times_diag>(X, Y.get_ref());
00134 }
00135
00136
00137
00139 template<typename T1, typename T2>
00140 arma_inline
00141 Mat< typename promote_type<typename T1::elem_type, typename T2::elem_type>::result >
00142 operator*
00143 (const Op<T1, op_diagmat>& X, const Op<T2, op_diagmat>& Y)
00144 {
00145 arma_extra_debug_sigprint();
00146
00147 typedef typename T1::elem_type eT1;
00148 typedef typename T2::elem_type eT2;
00149
00150 typedef typename promote_type<eT1,eT2>::result out_eT;
00151
00152 promote_type<eT1,eT2>::check();
00153
00154 const diagmat_proxy<T1> A(X.m);
00155 const diagmat_proxy<T2> B(Y.m);
00156
00157 arma_debug_assert_mul_size(A.n_elem, A.n_elem, B.n_elem, B.n_elem, "matrix multiply");
00158
00159 const uword N = A.n_elem;
00160
00161 Mat<out_eT> out(N,N);
00162
00163 out.zeros();
00164
00165 for(uword i=0; i<N; ++i)
00166 {
00167 out.at(i,i) = upgrade_val<eT1,eT2>::apply( A[i] ) * upgrade_val<eT1,eT2>::apply( B[i] );
00168 }
00169
00170 return out;
00171 }
00172
00173
00174
00176 template<typename T1, typename T2>
00177 arma_inline
00178 const Glue<T1, T2, glue_times>
00179 operator*
00180 (const Base<typename T1::elem_type,T1>& X, const Base<typename T1::elem_type,T2>& Y)
00181 {
00182 arma_extra_debug_sigprint();
00183
00184 return Glue<T1, T2, glue_times>(X.get_ref(), Y.get_ref());
00185 }
00186
00187
00188
00190 template<typename T1, typename T2>
00191 inline
00192 const mtGlue< typename promote_type<typename T1::elem_type, typename T2::elem_type>::result, T1, T2, glue_mixed_times >
00193 operator*
00194 (
00195 const Base< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T1_result, T1>& X,
00196 const Base< typename force_different_type<typename T1::elem_type, typename T2::elem_type>::T2_result, T2>& Y
00197 )
00198 {
00199 arma_extra_debug_sigprint();
00200
00201 typedef typename T1::elem_type eT1;
00202 typedef typename T2::elem_type eT2;
00203
00204 typedef typename promote_type<eT1,eT2>::result out_eT;
00205
00206 promote_type<eT1,eT2>::check();
00207
00208 return mtGlue<out_eT, T1, T2, glue_mixed_times>( X.get_ref(), Y.get_ref() );
00209 }
00210
00211
00212