source: XMLIO_V2/external/include/blitz/matuops.h @ 80

Last change on this file since 80 was 80, checked in by ymipsl, 14 years ago

ajout lib externe

  • Property svn:eol-style set to native
File size: 147.0 KB
Line 
1// Generated source file.  Do not edit.
2// Created by: genmatuops.cpp Dec 10 2003 17:58:05
3
4#ifndef BZ_MATUOPS_H
5#define BZ_MATUOPS_H
6
7BZ_NAMESPACE(blitz)
8
9#ifndef BZ_MATEXPR_H
10 #error <blitz/matuops.h> must be included via <blitz/matexpr.h>
11#endif
12
13/****************************************************************************
14 * abs
15 ****************************************************************************/
16
17template<class P_numtype1, class P_struct1>
18inline
19_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
20    _bz_abs<P_numtype1> > >
21abs(const Matrix<P_numtype1, P_struct1>& d1)
22{
23    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
24        _bz_abs<P_numtype1> > T_expr;
25
26    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
27}
28
29template<class P_expr1>
30inline
31_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
32    _bz_abs<typename P_expr1::T_numtype> > >
33abs(_bz_MatExpr<P_expr1> d1)
34{
35    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
36        _bz_abs<typename P_expr1::T_numtype> > T_expr;
37
38    return _bz_MatExpr<T_expr>(T_expr(d1));
39}
40
41
42/****************************************************************************
43 * acos
44 ****************************************************************************/
45
46template<class P_numtype1, class P_struct1>
47inline
48_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
49    _bz_acos<P_numtype1> > >
50acos(const Matrix<P_numtype1, P_struct1>& d1)
51{
52    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
53        _bz_acos<P_numtype1> > T_expr;
54
55    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
56}
57
58template<class P_expr1>
59inline
60_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
61    _bz_acos<typename P_expr1::T_numtype> > >
62acos(_bz_MatExpr<P_expr1> d1)
63{
64    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
65        _bz_acos<typename P_expr1::T_numtype> > T_expr;
66
67    return _bz_MatExpr<T_expr>(T_expr(d1));
68}
69
70
71/****************************************************************************
72 * acosh
73 ****************************************************************************/
74
75#ifdef BZ_HAVE_IEEE_MATH
76template<class P_numtype1, class P_struct1>
77inline
78_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
79    _bz_acosh<P_numtype1> > >
80acosh(const Matrix<P_numtype1, P_struct1>& d1)
81{
82    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
83        _bz_acosh<P_numtype1> > T_expr;
84
85    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
86}
87
88template<class P_expr1>
89inline
90_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
91    _bz_acosh<typename P_expr1::T_numtype> > >
92acosh(_bz_MatExpr<P_expr1> d1)
93{
94    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
95        _bz_acosh<typename P_expr1::T_numtype> > T_expr;
96
97    return _bz_MatExpr<T_expr>(T_expr(d1));
98}
99
100#endif
101
102/****************************************************************************
103 * asin
104 ****************************************************************************/
105
106template<class P_numtype1, class P_struct1>
107inline
108_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
109    _bz_asin<P_numtype1> > >
110asin(const Matrix<P_numtype1, P_struct1>& d1)
111{
112    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
113        _bz_asin<P_numtype1> > T_expr;
114
115    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
116}
117
118template<class P_expr1>
119inline
120_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
121    _bz_asin<typename P_expr1::T_numtype> > >
122asin(_bz_MatExpr<P_expr1> d1)
123{
124    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
125        _bz_asin<typename P_expr1::T_numtype> > T_expr;
126
127    return _bz_MatExpr<T_expr>(T_expr(d1));
128}
129
130
131/****************************************************************************
132 * asinh
133 ****************************************************************************/
134
135#ifdef BZ_HAVE_IEEE_MATH
136template<class P_numtype1, class P_struct1>
137inline
138_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
139    _bz_asinh<P_numtype1> > >
140asinh(const Matrix<P_numtype1, P_struct1>& d1)
141{
142    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
143        _bz_asinh<P_numtype1> > T_expr;
144
145    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
146}
147
148template<class P_expr1>
149inline
150_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
151    _bz_asinh<typename P_expr1::T_numtype> > >
152asinh(_bz_MatExpr<P_expr1> d1)
153{
154    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
155        _bz_asinh<typename P_expr1::T_numtype> > T_expr;
156
157    return _bz_MatExpr<T_expr>(T_expr(d1));
158}
159
160#endif
161
162/****************************************************************************
163 * atan
164 ****************************************************************************/
165
166template<class P_numtype1, class P_struct1>
167inline
168_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
169    _bz_atan<P_numtype1> > >
170atan(const Matrix<P_numtype1, P_struct1>& d1)
171{
172    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
173        _bz_atan<P_numtype1> > T_expr;
174
175    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
176}
177
178template<class P_expr1>
179inline
180_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
181    _bz_atan<typename P_expr1::T_numtype> > >
182atan(_bz_MatExpr<P_expr1> d1)
183{
184    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
185        _bz_atan<typename P_expr1::T_numtype> > T_expr;
186
187    return _bz_MatExpr<T_expr>(T_expr(d1));
188}
189
190
191/****************************************************************************
192 * atan2
193 ****************************************************************************/
194
195template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
196inline
197_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
198    _bz_atan2<P_numtype1,P_numtype2> > >
199atan2(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
200{
201    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
202        _bz_atan2<P_numtype1,P_numtype2> > T_expr;
203
204    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
205}
206
207template<class P_numtype1, class P_struct1, class P_expr2>
208inline
209_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
210    _bz_atan2<P_numtype1,typename P_expr2::T_numtype> > >
211atan2(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
212{
213    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
214        _bz_atan2<P_numtype1,typename P_expr2::T_numtype> > T_expr;
215
216    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
217}
218
219template<class P_numtype1, class P_struct1>
220inline
221_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
222    _bz_atan2<P_numtype1,int> > >
223atan2(const Matrix<P_numtype1, P_struct1>& d1, int d2)
224{
225    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
226        _bz_atan2<P_numtype1,int> > T_expr;
227
228    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
229}
230
231template<class P_numtype1, class P_struct1>
232inline
233_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
234    _bz_atan2<P_numtype1,float> > >
235atan2(const Matrix<P_numtype1, P_struct1>& d1, float d2)
236{
237    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
238        _bz_atan2<P_numtype1,float> > T_expr;
239
240    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
241}
242
243template<class P_numtype1, class P_struct1>
244inline
245_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
246    _bz_atan2<P_numtype1,double> > >
247atan2(const Matrix<P_numtype1, P_struct1>& d1, double d2)
248{
249    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
250        _bz_atan2<P_numtype1,double> > T_expr;
251
252    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
253}
254
255template<class P_numtype1, class P_struct1>
256inline
257_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
258    _bz_atan2<P_numtype1,long double> > >
259atan2(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
260{
261    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
262        _bz_atan2<P_numtype1,long double> > T_expr;
263
264    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
265}
266
267template<class P_numtype1, class P_struct1, class T2>
268inline
269_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
270    _bz_atan2<P_numtype1,complex<T2> > > >
271atan2(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
272{
273    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
274        _bz_atan2<P_numtype1,complex<T2> > > T_expr;
275
276    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
277}
278
279template<class P_expr1, class P_numtype2, class P_struct2>
280inline
281_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
282    _bz_atan2<typename P_expr1::T_numtype,P_numtype2> > >
283atan2(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
284{
285    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
286        _bz_atan2<typename P_expr1::T_numtype,P_numtype2> > T_expr;
287
288    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
289}
290
291template<class P_expr1, class P_expr2>
292inline
293_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
294    _bz_atan2<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
295atan2(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
296{
297    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
298        _bz_atan2<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
299
300    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
301}
302
303template<class P_expr1>
304inline
305_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
306    _bz_atan2<typename P_expr1::T_numtype,int> > >
307atan2(_bz_MatExpr<P_expr1> d1, int d2)
308{
309    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
310        _bz_atan2<typename P_expr1::T_numtype,int> > T_expr;
311
312    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
313}
314
315template<class P_expr1>
316inline
317_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
318    _bz_atan2<typename P_expr1::T_numtype,float> > >
319atan2(_bz_MatExpr<P_expr1> d1, float d2)
320{
321    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
322        _bz_atan2<typename P_expr1::T_numtype,float> > T_expr;
323
324    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
325}
326
327template<class P_expr1>
328inline
329_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
330    _bz_atan2<typename P_expr1::T_numtype,double> > >
331atan2(_bz_MatExpr<P_expr1> d1, double d2)
332{
333    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
334        _bz_atan2<typename P_expr1::T_numtype,double> > T_expr;
335
336    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
337}
338
339template<class P_expr1>
340inline
341_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
342    _bz_atan2<typename P_expr1::T_numtype,long double> > >
343atan2(_bz_MatExpr<P_expr1> d1, long double d2)
344{
345    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
346        _bz_atan2<typename P_expr1::T_numtype,long double> > T_expr;
347
348    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
349}
350
351template<class P_expr1, class T2>
352inline
353_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
354    _bz_atan2<typename P_expr1::T_numtype,complex<T2> > > >
355atan2(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
356{
357    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
358        _bz_atan2<typename P_expr1::T_numtype,complex<T2> > > T_expr;
359
360    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
361}
362
363template<class P_numtype2, class P_struct2>
364inline
365_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
366    _bz_atan2<int,P_numtype2> > >
367atan2(int d1, const Matrix<P_numtype2, P_struct2>& d2)
368{
369    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
370        _bz_atan2<int,P_numtype2> > T_expr;
371
372    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
373}
374
375template<class P_expr2>
376inline
377_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
378    _bz_atan2<int,typename P_expr2::T_numtype> > >
379atan2(int d1, _bz_MatExpr<P_expr2> d2)
380{
381    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
382        _bz_atan2<int,typename P_expr2::T_numtype> > T_expr;
383
384    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
385}
386
387template<class P_numtype2, class P_struct2>
388inline
389_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
390    _bz_atan2<float,P_numtype2> > >
391atan2(float d1, const Matrix<P_numtype2, P_struct2>& d2)
392{
393    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
394        _bz_atan2<float,P_numtype2> > T_expr;
395
396    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
397}
398
399template<class P_expr2>
400inline
401_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
402    _bz_atan2<float,typename P_expr2::T_numtype> > >
403atan2(float d1, _bz_MatExpr<P_expr2> d2)
404{
405    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
406        _bz_atan2<float,typename P_expr2::T_numtype> > T_expr;
407
408    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
409}
410
411template<class P_numtype2, class P_struct2>
412inline
413_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
414    _bz_atan2<double,P_numtype2> > >
415atan2(double d1, const Matrix<P_numtype2, P_struct2>& d2)
416{
417    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
418        _bz_atan2<double,P_numtype2> > T_expr;
419
420    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
421}
422
423template<class P_expr2>
424inline
425_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
426    _bz_atan2<double,typename P_expr2::T_numtype> > >
427atan2(double d1, _bz_MatExpr<P_expr2> d2)
428{
429    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
430        _bz_atan2<double,typename P_expr2::T_numtype> > T_expr;
431
432    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
433}
434
435template<class P_numtype2, class P_struct2>
436inline
437_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
438    _bz_atan2<long double,P_numtype2> > >
439atan2(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
440{
441    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
442        _bz_atan2<long double,P_numtype2> > T_expr;
443
444    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
445}
446
447template<class P_expr2>
448inline
449_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
450    _bz_atan2<long double,typename P_expr2::T_numtype> > >
451atan2(long double d1, _bz_MatExpr<P_expr2> d2)
452{
453    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
454        _bz_atan2<long double,typename P_expr2::T_numtype> > T_expr;
455
456    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
457}
458
459template<class T1, class P_numtype2, class P_struct2>
460inline
461_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
462    _bz_atan2<complex<T1> ,P_numtype2> > >
463atan2(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
464{
465    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
466        _bz_atan2<complex<T1> ,P_numtype2> > T_expr;
467
468    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
469}
470
471template<class T1, class P_expr2>
472inline
473_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
474    _bz_atan2<complex<T1> ,typename P_expr2::T_numtype> > >
475atan2(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
476{
477    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
478        _bz_atan2<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
479
480    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
481}
482
483
484/****************************************************************************
485 * atanh
486 ****************************************************************************/
487
488#ifdef BZ_HAVE_IEEE_MATH
489template<class P_numtype1, class P_struct1>
490inline
491_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
492    _bz_atanh<P_numtype1> > >
493atanh(const Matrix<P_numtype1, P_struct1>& d1)
494{
495    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
496        _bz_atanh<P_numtype1> > T_expr;
497
498    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
499}
500
501template<class P_expr1>
502inline
503_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
504    _bz_atanh<typename P_expr1::T_numtype> > >
505atanh(_bz_MatExpr<P_expr1> d1)
506{
507    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
508        _bz_atanh<typename P_expr1::T_numtype> > T_expr;
509
510    return _bz_MatExpr<T_expr>(T_expr(d1));
511}
512
513#endif
514
515/****************************************************************************
516 * _class
517 ****************************************************************************/
518
519#ifdef BZ_HAVE_SYSTEM_V_MATH
520template<class P_numtype1, class P_struct1>
521inline
522_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
523    _bz__class<P_numtype1> > >
524_class(const Matrix<P_numtype1, P_struct1>& d1)
525{
526    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
527        _bz__class<P_numtype1> > T_expr;
528
529    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
530}
531
532template<class P_expr1>
533inline
534_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
535    _bz__class<typename P_expr1::T_numtype> > >
536_class(_bz_MatExpr<P_expr1> d1)
537{
538    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
539        _bz__class<typename P_expr1::T_numtype> > T_expr;
540
541    return _bz_MatExpr<T_expr>(T_expr(d1));
542}
543
544#endif
545
546/****************************************************************************
547 * cbrt
548 ****************************************************************************/
549
550#ifdef BZ_HAVE_IEEE_MATH
551template<class P_numtype1, class P_struct1>
552inline
553_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
554    _bz_cbrt<P_numtype1> > >
555cbrt(const Matrix<P_numtype1, P_struct1>& d1)
556{
557    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
558        _bz_cbrt<P_numtype1> > T_expr;
559
560    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
561}
562
563template<class P_expr1>
564inline
565_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
566    _bz_cbrt<typename P_expr1::T_numtype> > >
567cbrt(_bz_MatExpr<P_expr1> d1)
568{
569    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
570        _bz_cbrt<typename P_expr1::T_numtype> > T_expr;
571
572    return _bz_MatExpr<T_expr>(T_expr(d1));
573}
574
575#endif
576
577/****************************************************************************
578 * ceil
579 ****************************************************************************/
580
581template<class P_numtype1, class P_struct1>
582inline
583_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
584    _bz_ceil<P_numtype1> > >
585ceil(const Matrix<P_numtype1, P_struct1>& d1)
586{
587    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
588        _bz_ceil<P_numtype1> > T_expr;
589
590    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
591}
592
593template<class P_expr1>
594inline
595_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
596    _bz_ceil<typename P_expr1::T_numtype> > >
597ceil(_bz_MatExpr<P_expr1> d1)
598{
599    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
600        _bz_ceil<typename P_expr1::T_numtype> > T_expr;
601
602    return _bz_MatExpr<T_expr>(T_expr(d1));
603}
604
605
606/****************************************************************************
607 * copysign
608 ****************************************************************************/
609
610#ifdef BZ_HAVE_SYSTEM_V_MATH
611template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
612inline
613_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
614    _bz_copysign<P_numtype1,P_numtype2> > >
615copysign(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
616{
617    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
618        _bz_copysign<P_numtype1,P_numtype2> > T_expr;
619
620    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
621}
622
623template<class P_numtype1, class P_struct1, class P_expr2>
624inline
625_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
626    _bz_copysign<P_numtype1,typename P_expr2::T_numtype> > >
627copysign(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
628{
629    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
630        _bz_copysign<P_numtype1,typename P_expr2::T_numtype> > T_expr;
631
632    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
633}
634
635template<class P_numtype1, class P_struct1>
636inline
637_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
638    _bz_copysign<P_numtype1,int> > >
639copysign(const Matrix<P_numtype1, P_struct1>& d1, int d2)
640{
641    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
642        _bz_copysign<P_numtype1,int> > T_expr;
643
644    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
645}
646
647template<class P_numtype1, class P_struct1>
648inline
649_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
650    _bz_copysign<P_numtype1,float> > >
651copysign(const Matrix<P_numtype1, P_struct1>& d1, float d2)
652{
653    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
654        _bz_copysign<P_numtype1,float> > T_expr;
655
656    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
657}
658
659template<class P_numtype1, class P_struct1>
660inline
661_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
662    _bz_copysign<P_numtype1,double> > >
663copysign(const Matrix<P_numtype1, P_struct1>& d1, double d2)
664{
665    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
666        _bz_copysign<P_numtype1,double> > T_expr;
667
668    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
669}
670
671template<class P_numtype1, class P_struct1>
672inline
673_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
674    _bz_copysign<P_numtype1,long double> > >
675copysign(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
676{
677    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
678        _bz_copysign<P_numtype1,long double> > T_expr;
679
680    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
681}
682
683template<class P_numtype1, class P_struct1, class T2>
684inline
685_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
686    _bz_copysign<P_numtype1,complex<T2> > > >
687copysign(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
688{
689    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
690        _bz_copysign<P_numtype1,complex<T2> > > T_expr;
691
692    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
693}
694
695template<class P_expr1, class P_numtype2, class P_struct2>
696inline
697_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
698    _bz_copysign<typename P_expr1::T_numtype,P_numtype2> > >
699copysign(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
700{
701    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
702        _bz_copysign<typename P_expr1::T_numtype,P_numtype2> > T_expr;
703
704    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
705}
706
707template<class P_expr1, class P_expr2>
708inline
709_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
710    _bz_copysign<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
711copysign(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
712{
713    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
714        _bz_copysign<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
715
716    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
717}
718
719template<class P_expr1>
720inline
721_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
722    _bz_copysign<typename P_expr1::T_numtype,int> > >
723copysign(_bz_MatExpr<P_expr1> d1, int d2)
724{
725    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
726        _bz_copysign<typename P_expr1::T_numtype,int> > T_expr;
727
728    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
729}
730
731template<class P_expr1>
732inline
733_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
734    _bz_copysign<typename P_expr1::T_numtype,float> > >
735copysign(_bz_MatExpr<P_expr1> d1, float d2)
736{
737    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
738        _bz_copysign<typename P_expr1::T_numtype,float> > T_expr;
739
740    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
741}
742
743template<class P_expr1>
744inline
745_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
746    _bz_copysign<typename P_expr1::T_numtype,double> > >
747copysign(_bz_MatExpr<P_expr1> d1, double d2)
748{
749    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
750        _bz_copysign<typename P_expr1::T_numtype,double> > T_expr;
751
752    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
753}
754
755template<class P_expr1>
756inline
757_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
758    _bz_copysign<typename P_expr1::T_numtype,long double> > >
759copysign(_bz_MatExpr<P_expr1> d1, long double d2)
760{
761    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
762        _bz_copysign<typename P_expr1::T_numtype,long double> > T_expr;
763
764    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
765}
766
767template<class P_expr1, class T2>
768inline
769_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
770    _bz_copysign<typename P_expr1::T_numtype,complex<T2> > > >
771copysign(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
772{
773    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
774        _bz_copysign<typename P_expr1::T_numtype,complex<T2> > > T_expr;
775
776    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
777}
778
779template<class P_numtype2, class P_struct2>
780inline
781_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
782    _bz_copysign<int,P_numtype2> > >
783copysign(int d1, const Matrix<P_numtype2, P_struct2>& d2)
784{
785    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
786        _bz_copysign<int,P_numtype2> > T_expr;
787
788    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
789}
790
791template<class P_expr2>
792inline
793_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
794    _bz_copysign<int,typename P_expr2::T_numtype> > >
795copysign(int d1, _bz_MatExpr<P_expr2> d2)
796{
797    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
798        _bz_copysign<int,typename P_expr2::T_numtype> > T_expr;
799
800    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
801}
802
803template<class P_numtype2, class P_struct2>
804inline
805_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
806    _bz_copysign<float,P_numtype2> > >
807copysign(float d1, const Matrix<P_numtype2, P_struct2>& d2)
808{
809    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
810        _bz_copysign<float,P_numtype2> > T_expr;
811
812    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
813}
814
815template<class P_expr2>
816inline
817_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
818    _bz_copysign<float,typename P_expr2::T_numtype> > >
819copysign(float d1, _bz_MatExpr<P_expr2> d2)
820{
821    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
822        _bz_copysign<float,typename P_expr2::T_numtype> > T_expr;
823
824    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
825}
826
827template<class P_numtype2, class P_struct2>
828inline
829_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
830    _bz_copysign<double,P_numtype2> > >
831copysign(double d1, const Matrix<P_numtype2, P_struct2>& d2)
832{
833    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
834        _bz_copysign<double,P_numtype2> > T_expr;
835
836    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
837}
838
839template<class P_expr2>
840inline
841_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
842    _bz_copysign<double,typename P_expr2::T_numtype> > >
843copysign(double d1, _bz_MatExpr<P_expr2> d2)
844{
845    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
846        _bz_copysign<double,typename P_expr2::T_numtype> > T_expr;
847
848    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
849}
850
851template<class P_numtype2, class P_struct2>
852inline
853_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
854    _bz_copysign<long double,P_numtype2> > >
855copysign(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
856{
857    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
858        _bz_copysign<long double,P_numtype2> > T_expr;
859
860    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
861}
862
863template<class P_expr2>
864inline
865_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
866    _bz_copysign<long double,typename P_expr2::T_numtype> > >
867copysign(long double d1, _bz_MatExpr<P_expr2> d2)
868{
869    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
870        _bz_copysign<long double,typename P_expr2::T_numtype> > T_expr;
871
872    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
873}
874
875template<class T1, class P_numtype2, class P_struct2>
876inline
877_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
878    _bz_copysign<complex<T1> ,P_numtype2> > >
879copysign(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
880{
881    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
882        _bz_copysign<complex<T1> ,P_numtype2> > T_expr;
883
884    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
885}
886
887template<class T1, class P_expr2>
888inline
889_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
890    _bz_copysign<complex<T1> ,typename P_expr2::T_numtype> > >
891copysign(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
892{
893    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
894        _bz_copysign<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
895
896    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
897}
898
899#endif
900
901/****************************************************************************
902 * cos
903 ****************************************************************************/
904
905template<class P_numtype1, class P_struct1>
906inline
907_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
908    _bz_cos<P_numtype1> > >
909cos(const Matrix<P_numtype1, P_struct1>& d1)
910{
911    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
912        _bz_cos<P_numtype1> > T_expr;
913
914    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
915}
916
917template<class P_expr1>
918inline
919_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
920    _bz_cos<typename P_expr1::T_numtype> > >
921cos(_bz_MatExpr<P_expr1> d1)
922{
923    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
924        _bz_cos<typename P_expr1::T_numtype> > T_expr;
925
926    return _bz_MatExpr<T_expr>(T_expr(d1));
927}
928
929
930/****************************************************************************
931 * cosh
932 ****************************************************************************/
933
934template<class P_numtype1, class P_struct1>
935inline
936_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
937    _bz_cosh<P_numtype1> > >
938cosh(const Matrix<P_numtype1, P_struct1>& d1)
939{
940    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
941        _bz_cosh<P_numtype1> > T_expr;
942
943    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
944}
945
946template<class P_expr1>
947inline
948_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
949    _bz_cosh<typename P_expr1::T_numtype> > >
950cosh(_bz_MatExpr<P_expr1> d1)
951{
952    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
953        _bz_cosh<typename P_expr1::T_numtype> > T_expr;
954
955    return _bz_MatExpr<T_expr>(T_expr(d1));
956}
957
958
959/****************************************************************************
960 * drem
961 ****************************************************************************/
962
963#ifdef BZ_HAVE_SYSTEM_V_MATH
964template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
965inline
966_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
967    _bz_drem<P_numtype1,P_numtype2> > >
968drem(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
969{
970    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
971        _bz_drem<P_numtype1,P_numtype2> > T_expr;
972
973    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
974}
975
976template<class P_numtype1, class P_struct1, class P_expr2>
977inline
978_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
979    _bz_drem<P_numtype1,typename P_expr2::T_numtype> > >
980drem(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
981{
982    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
983        _bz_drem<P_numtype1,typename P_expr2::T_numtype> > T_expr;
984
985    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
986}
987
988template<class P_numtype1, class P_struct1>
989inline
990_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
991    _bz_drem<P_numtype1,int> > >
992drem(const Matrix<P_numtype1, P_struct1>& d1, int d2)
993{
994    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
995        _bz_drem<P_numtype1,int> > T_expr;
996
997    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
998}
999
1000template<class P_numtype1, class P_struct1>
1001inline
1002_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1003    _bz_drem<P_numtype1,float> > >
1004drem(const Matrix<P_numtype1, P_struct1>& d1, float d2)
1005{
1006    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1007        _bz_drem<P_numtype1,float> > T_expr;
1008
1009    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
1010}
1011
1012template<class P_numtype1, class P_struct1>
1013inline
1014_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1015    _bz_drem<P_numtype1,double> > >
1016drem(const Matrix<P_numtype1, P_struct1>& d1, double d2)
1017{
1018    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1019        _bz_drem<P_numtype1,double> > T_expr;
1020
1021    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
1022}
1023
1024template<class P_numtype1, class P_struct1>
1025inline
1026_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1027    _bz_drem<P_numtype1,long double> > >
1028drem(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
1029{
1030    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1031        _bz_drem<P_numtype1,long double> > T_expr;
1032
1033    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
1034}
1035
1036template<class P_numtype1, class P_struct1, class T2>
1037inline
1038_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1039    _bz_drem<P_numtype1,complex<T2> > > >
1040drem(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
1041{
1042    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1043        _bz_drem<P_numtype1,complex<T2> > > T_expr;
1044
1045    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
1046}
1047
1048template<class P_expr1, class P_numtype2, class P_struct2>
1049inline
1050_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1051    _bz_drem<typename P_expr1::T_numtype,P_numtype2> > >
1052drem(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
1053{
1054    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1055        _bz_drem<typename P_expr1::T_numtype,P_numtype2> > T_expr;
1056
1057    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
1058}
1059
1060template<class P_expr1, class P_expr2>
1061inline
1062_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1063    _bz_drem<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
1064drem(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
1065{
1066    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1067        _bz_drem<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
1068
1069    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
1070}
1071
1072template<class P_expr1>
1073inline
1074_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1075    _bz_drem<typename P_expr1::T_numtype,int> > >
1076drem(_bz_MatExpr<P_expr1> d1, int d2)
1077{
1078    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1079        _bz_drem<typename P_expr1::T_numtype,int> > T_expr;
1080
1081    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
1082}
1083
1084template<class P_expr1>
1085inline
1086_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1087    _bz_drem<typename P_expr1::T_numtype,float> > >
1088drem(_bz_MatExpr<P_expr1> d1, float d2)
1089{
1090    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1091        _bz_drem<typename P_expr1::T_numtype,float> > T_expr;
1092
1093    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
1094}
1095
1096template<class P_expr1>
1097inline
1098_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1099    _bz_drem<typename P_expr1::T_numtype,double> > >
1100drem(_bz_MatExpr<P_expr1> d1, double d2)
1101{
1102    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1103        _bz_drem<typename P_expr1::T_numtype,double> > T_expr;
1104
1105    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
1106}
1107
1108template<class P_expr1>
1109inline
1110_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1111    _bz_drem<typename P_expr1::T_numtype,long double> > >
1112drem(_bz_MatExpr<P_expr1> d1, long double d2)
1113{
1114    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1115        _bz_drem<typename P_expr1::T_numtype,long double> > T_expr;
1116
1117    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
1118}
1119
1120template<class P_expr1, class T2>
1121inline
1122_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1123    _bz_drem<typename P_expr1::T_numtype,complex<T2> > > >
1124drem(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
1125{
1126    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1127        _bz_drem<typename P_expr1::T_numtype,complex<T2> > > T_expr;
1128
1129    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
1130}
1131
1132template<class P_numtype2, class P_struct2>
1133inline
1134_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1135    _bz_drem<int,P_numtype2> > >
1136drem(int d1, const Matrix<P_numtype2, P_struct2>& d2)
1137{
1138    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1139        _bz_drem<int,P_numtype2> > T_expr;
1140
1141    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
1142}
1143
1144template<class P_expr2>
1145inline
1146_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1147    _bz_drem<int,typename P_expr2::T_numtype> > >
1148drem(int d1, _bz_MatExpr<P_expr2> d2)
1149{
1150    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1151        _bz_drem<int,typename P_expr2::T_numtype> > T_expr;
1152
1153    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
1154}
1155
1156template<class P_numtype2, class P_struct2>
1157inline
1158_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1159    _bz_drem<float,P_numtype2> > >
1160drem(float d1, const Matrix<P_numtype2, P_struct2>& d2)
1161{
1162    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1163        _bz_drem<float,P_numtype2> > T_expr;
1164
1165    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
1166}
1167
1168template<class P_expr2>
1169inline
1170_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1171    _bz_drem<float,typename P_expr2::T_numtype> > >
1172drem(float d1, _bz_MatExpr<P_expr2> d2)
1173{
1174    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1175        _bz_drem<float,typename P_expr2::T_numtype> > T_expr;
1176
1177    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
1178}
1179
1180template<class P_numtype2, class P_struct2>
1181inline
1182_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1183    _bz_drem<double,P_numtype2> > >
1184drem(double d1, const Matrix<P_numtype2, P_struct2>& d2)
1185{
1186    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1187        _bz_drem<double,P_numtype2> > T_expr;
1188
1189    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
1190}
1191
1192template<class P_expr2>
1193inline
1194_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1195    _bz_drem<double,typename P_expr2::T_numtype> > >
1196drem(double d1, _bz_MatExpr<P_expr2> d2)
1197{
1198    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1199        _bz_drem<double,typename P_expr2::T_numtype> > T_expr;
1200
1201    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
1202}
1203
1204template<class P_numtype2, class P_struct2>
1205inline
1206_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1207    _bz_drem<long double,P_numtype2> > >
1208drem(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
1209{
1210    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1211        _bz_drem<long double,P_numtype2> > T_expr;
1212
1213    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
1214}
1215
1216template<class P_expr2>
1217inline
1218_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1219    _bz_drem<long double,typename P_expr2::T_numtype> > >
1220drem(long double d1, _bz_MatExpr<P_expr2> d2)
1221{
1222    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1223        _bz_drem<long double,typename P_expr2::T_numtype> > T_expr;
1224
1225    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
1226}
1227
1228template<class T1, class P_numtype2, class P_struct2>
1229inline
1230_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
1231    _bz_drem<complex<T1> ,P_numtype2> > >
1232drem(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
1233{
1234    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
1235        _bz_drem<complex<T1> ,P_numtype2> > T_expr;
1236
1237    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
1238}
1239
1240template<class T1, class P_expr2>
1241inline
1242_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
1243    _bz_drem<complex<T1> ,typename P_expr2::T_numtype> > >
1244drem(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
1245{
1246    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
1247        _bz_drem<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
1248
1249    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
1250}
1251
1252#endif
1253
1254/****************************************************************************
1255 * exp
1256 ****************************************************************************/
1257
1258template<class P_numtype1, class P_struct1>
1259inline
1260_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1261    _bz_exp<P_numtype1> > >
1262exp(const Matrix<P_numtype1, P_struct1>& d1)
1263{
1264    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1265        _bz_exp<P_numtype1> > T_expr;
1266
1267    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1268}
1269
1270template<class P_expr1>
1271inline
1272_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1273    _bz_exp<typename P_expr1::T_numtype> > >
1274exp(_bz_MatExpr<P_expr1> d1)
1275{
1276    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1277        _bz_exp<typename P_expr1::T_numtype> > T_expr;
1278
1279    return _bz_MatExpr<T_expr>(T_expr(d1));
1280}
1281
1282
1283/****************************************************************************
1284 * expm1
1285 ****************************************************************************/
1286
1287#ifdef BZ_HAVE_IEEE_MATH
1288template<class P_numtype1, class P_struct1>
1289inline
1290_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1291    _bz_expm1<P_numtype1> > >
1292expm1(const Matrix<P_numtype1, P_struct1>& d1)
1293{
1294    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1295        _bz_expm1<P_numtype1> > T_expr;
1296
1297    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1298}
1299
1300template<class P_expr1>
1301inline
1302_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1303    _bz_expm1<typename P_expr1::T_numtype> > >
1304expm1(_bz_MatExpr<P_expr1> d1)
1305{
1306    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1307        _bz_expm1<typename P_expr1::T_numtype> > T_expr;
1308
1309    return _bz_MatExpr<T_expr>(T_expr(d1));
1310}
1311
1312#endif
1313
1314/****************************************************************************
1315 * erf
1316 ****************************************************************************/
1317
1318#ifdef BZ_HAVE_IEEE_MATH
1319template<class P_numtype1, class P_struct1>
1320inline
1321_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1322    _bz_erf<P_numtype1> > >
1323erf(const Matrix<P_numtype1, P_struct1>& d1)
1324{
1325    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1326        _bz_erf<P_numtype1> > T_expr;
1327
1328    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1329}
1330
1331template<class P_expr1>
1332inline
1333_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1334    _bz_erf<typename P_expr1::T_numtype> > >
1335erf(_bz_MatExpr<P_expr1> d1)
1336{
1337    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1338        _bz_erf<typename P_expr1::T_numtype> > T_expr;
1339
1340    return _bz_MatExpr<T_expr>(T_expr(d1));
1341}
1342
1343#endif
1344
1345/****************************************************************************
1346 * erfc
1347 ****************************************************************************/
1348
1349#ifdef BZ_HAVE_IEEE_MATH
1350template<class P_numtype1, class P_struct1>
1351inline
1352_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1353    _bz_erfc<P_numtype1> > >
1354erfc(const Matrix<P_numtype1, P_struct1>& d1)
1355{
1356    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1357        _bz_erfc<P_numtype1> > T_expr;
1358
1359    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1360}
1361
1362template<class P_expr1>
1363inline
1364_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1365    _bz_erfc<typename P_expr1::T_numtype> > >
1366erfc(_bz_MatExpr<P_expr1> d1)
1367{
1368    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1369        _bz_erfc<typename P_expr1::T_numtype> > T_expr;
1370
1371    return _bz_MatExpr<T_expr>(T_expr(d1));
1372}
1373
1374#endif
1375
1376/****************************************************************************
1377 * fabs
1378 ****************************************************************************/
1379
1380template<class P_numtype1, class P_struct1>
1381inline
1382_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1383    _bz_abs<P_numtype1> > >
1384fabs(const Matrix<P_numtype1, P_struct1>& d1)
1385{
1386    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1387        _bz_abs<P_numtype1> > T_expr;
1388
1389    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1390}
1391
1392template<class P_expr1>
1393inline
1394_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1395    _bz_abs<typename P_expr1::T_numtype> > >
1396fabs(_bz_MatExpr<P_expr1> d1)
1397{
1398    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1399        _bz_abs<typename P_expr1::T_numtype> > T_expr;
1400
1401    return _bz_MatExpr<T_expr>(T_expr(d1));
1402}
1403
1404
1405/****************************************************************************
1406 * floor
1407 ****************************************************************************/
1408
1409template<class P_numtype1, class P_struct1>
1410inline
1411_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1412    _bz_floor<P_numtype1> > >
1413floor(const Matrix<P_numtype1, P_struct1>& d1)
1414{
1415    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
1416        _bz_floor<P_numtype1> > T_expr;
1417
1418    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
1419}
1420
1421template<class P_expr1>
1422inline
1423_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1424    _bz_floor<typename P_expr1::T_numtype> > >
1425floor(_bz_MatExpr<P_expr1> d1)
1426{
1427    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
1428        _bz_floor<typename P_expr1::T_numtype> > T_expr;
1429
1430    return _bz_MatExpr<T_expr>(T_expr(d1));
1431}
1432
1433
1434/****************************************************************************
1435 * fmod
1436 ****************************************************************************/
1437
1438template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
1439inline
1440_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1441    _bz_fmod<P_numtype1,P_numtype2> > >
1442fmod(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
1443{
1444    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1445        _bz_fmod<P_numtype1,P_numtype2> > T_expr;
1446
1447    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
1448}
1449
1450template<class P_numtype1, class P_struct1, class P_expr2>
1451inline
1452_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
1453    _bz_fmod<P_numtype1,typename P_expr2::T_numtype> > >
1454fmod(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
1455{
1456    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
1457        _bz_fmod<P_numtype1,typename P_expr2::T_numtype> > T_expr;
1458
1459    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
1460}
1461
1462template<class P_numtype1, class P_struct1>
1463inline
1464_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
1465    _bz_fmod<P_numtype1,int> > >
1466fmod(const Matrix<P_numtype1, P_struct1>& d1, int d2)
1467{
1468    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
1469        _bz_fmod<P_numtype1,int> > T_expr;
1470
1471    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
1472}
1473
1474template<class P_numtype1, class P_struct1>
1475inline
1476_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1477    _bz_fmod<P_numtype1,float> > >
1478fmod(const Matrix<P_numtype1, P_struct1>& d1, float d2)
1479{
1480    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1481        _bz_fmod<P_numtype1,float> > T_expr;
1482
1483    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
1484}
1485
1486template<class P_numtype1, class P_struct1>
1487inline
1488_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1489    _bz_fmod<P_numtype1,double> > >
1490fmod(const Matrix<P_numtype1, P_struct1>& d1, double d2)
1491{
1492    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1493        _bz_fmod<P_numtype1,double> > T_expr;
1494
1495    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
1496}
1497
1498template<class P_numtype1, class P_struct1>
1499inline
1500_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1501    _bz_fmod<P_numtype1,long double> > >
1502fmod(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
1503{
1504    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1505        _bz_fmod<P_numtype1,long double> > T_expr;
1506
1507    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
1508}
1509
1510template<class P_numtype1, class P_struct1, class T2>
1511inline
1512_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1513    _bz_fmod<P_numtype1,complex<T2> > > >
1514fmod(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
1515{
1516    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1517        _bz_fmod<P_numtype1,complex<T2> > > T_expr;
1518
1519    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
1520}
1521
1522template<class P_expr1, class P_numtype2, class P_struct2>
1523inline
1524_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1525    _bz_fmod<typename P_expr1::T_numtype,P_numtype2> > >
1526fmod(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
1527{
1528    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1529        _bz_fmod<typename P_expr1::T_numtype,P_numtype2> > T_expr;
1530
1531    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
1532}
1533
1534template<class P_expr1, class P_expr2>
1535inline
1536_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1537    _bz_fmod<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
1538fmod(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
1539{
1540    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1541        _bz_fmod<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
1542
1543    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
1544}
1545
1546template<class P_expr1>
1547inline
1548_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1549    _bz_fmod<typename P_expr1::T_numtype,int> > >
1550fmod(_bz_MatExpr<P_expr1> d1, int d2)
1551{
1552    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1553        _bz_fmod<typename P_expr1::T_numtype,int> > T_expr;
1554
1555    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
1556}
1557
1558template<class P_expr1>
1559inline
1560_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1561    _bz_fmod<typename P_expr1::T_numtype,float> > >
1562fmod(_bz_MatExpr<P_expr1> d1, float d2)
1563{
1564    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1565        _bz_fmod<typename P_expr1::T_numtype,float> > T_expr;
1566
1567    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
1568}
1569
1570template<class P_expr1>
1571inline
1572_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1573    _bz_fmod<typename P_expr1::T_numtype,double> > >
1574fmod(_bz_MatExpr<P_expr1> d1, double d2)
1575{
1576    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1577        _bz_fmod<typename P_expr1::T_numtype,double> > T_expr;
1578
1579    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
1580}
1581
1582template<class P_expr1>
1583inline
1584_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1585    _bz_fmod<typename P_expr1::T_numtype,long double> > >
1586fmod(_bz_MatExpr<P_expr1> d1, long double d2)
1587{
1588    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1589        _bz_fmod<typename P_expr1::T_numtype,long double> > T_expr;
1590
1591    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
1592}
1593
1594template<class P_expr1, class T2>
1595inline
1596_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1597    _bz_fmod<typename P_expr1::T_numtype,complex<T2> > > >
1598fmod(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
1599{
1600    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1601        _bz_fmod<typename P_expr1::T_numtype,complex<T2> > > T_expr;
1602
1603    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
1604}
1605
1606template<class P_numtype2, class P_struct2>
1607inline
1608_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1609    _bz_fmod<int,P_numtype2> > >
1610fmod(int d1, const Matrix<P_numtype2, P_struct2>& d2)
1611{
1612    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1613        _bz_fmod<int,P_numtype2> > T_expr;
1614
1615    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
1616}
1617
1618template<class P_expr2>
1619inline
1620_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1621    _bz_fmod<int,typename P_expr2::T_numtype> > >
1622fmod(int d1, _bz_MatExpr<P_expr2> d2)
1623{
1624    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1625        _bz_fmod<int,typename P_expr2::T_numtype> > T_expr;
1626
1627    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
1628}
1629
1630template<class P_numtype2, class P_struct2>
1631inline
1632_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1633    _bz_fmod<float,P_numtype2> > >
1634fmod(float d1, const Matrix<P_numtype2, P_struct2>& d2)
1635{
1636    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1637        _bz_fmod<float,P_numtype2> > T_expr;
1638
1639    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
1640}
1641
1642template<class P_expr2>
1643inline
1644_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1645    _bz_fmod<float,typename P_expr2::T_numtype> > >
1646fmod(float d1, _bz_MatExpr<P_expr2> d2)
1647{
1648    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1649        _bz_fmod<float,typename P_expr2::T_numtype> > T_expr;
1650
1651    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
1652}
1653
1654template<class P_numtype2, class P_struct2>
1655inline
1656_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1657    _bz_fmod<double,P_numtype2> > >
1658fmod(double d1, const Matrix<P_numtype2, P_struct2>& d2)
1659{
1660    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1661        _bz_fmod<double,P_numtype2> > T_expr;
1662
1663    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
1664}
1665
1666template<class P_expr2>
1667inline
1668_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1669    _bz_fmod<double,typename P_expr2::T_numtype> > >
1670fmod(double d1, _bz_MatExpr<P_expr2> d2)
1671{
1672    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1673        _bz_fmod<double,typename P_expr2::T_numtype> > T_expr;
1674
1675    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
1676}
1677
1678template<class P_numtype2, class P_struct2>
1679inline
1680_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1681    _bz_fmod<long double,P_numtype2> > >
1682fmod(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
1683{
1684    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1685        _bz_fmod<long double,P_numtype2> > T_expr;
1686
1687    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
1688}
1689
1690template<class P_expr2>
1691inline
1692_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1693    _bz_fmod<long double,typename P_expr2::T_numtype> > >
1694fmod(long double d1, _bz_MatExpr<P_expr2> d2)
1695{
1696    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1697        _bz_fmod<long double,typename P_expr2::T_numtype> > T_expr;
1698
1699    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
1700}
1701
1702template<class T1, class P_numtype2, class P_struct2>
1703inline
1704_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
1705    _bz_fmod<complex<T1> ,P_numtype2> > >
1706fmod(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
1707{
1708    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
1709        _bz_fmod<complex<T1> ,P_numtype2> > T_expr;
1710
1711    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
1712}
1713
1714template<class T1, class P_expr2>
1715inline
1716_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
1717    _bz_fmod<complex<T1> ,typename P_expr2::T_numtype> > >
1718fmod(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
1719{
1720    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
1721        _bz_fmod<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
1722
1723    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
1724}
1725
1726
1727/****************************************************************************
1728 * hypot
1729 ****************************************************************************/
1730
1731#ifdef BZ_HAVE_SYSTEM_V_MATH
1732template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
1733inline
1734_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1735    _bz_hypot<P_numtype1,P_numtype2> > >
1736hypot(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
1737{
1738    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1739        _bz_hypot<P_numtype1,P_numtype2> > T_expr;
1740
1741    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
1742}
1743
1744template<class P_numtype1, class P_struct1, class P_expr2>
1745inline
1746_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
1747    _bz_hypot<P_numtype1,typename P_expr2::T_numtype> > >
1748hypot(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
1749{
1750    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
1751        _bz_hypot<P_numtype1,typename P_expr2::T_numtype> > T_expr;
1752
1753    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
1754}
1755
1756template<class P_numtype1, class P_struct1>
1757inline
1758_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
1759    _bz_hypot<P_numtype1,int> > >
1760hypot(const Matrix<P_numtype1, P_struct1>& d1, int d2)
1761{
1762    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
1763        _bz_hypot<P_numtype1,int> > T_expr;
1764
1765    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
1766}
1767
1768template<class P_numtype1, class P_struct1>
1769inline
1770_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1771    _bz_hypot<P_numtype1,float> > >
1772hypot(const Matrix<P_numtype1, P_struct1>& d1, float d2)
1773{
1774    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
1775        _bz_hypot<P_numtype1,float> > T_expr;
1776
1777    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
1778}
1779
1780template<class P_numtype1, class P_struct1>
1781inline
1782_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1783    _bz_hypot<P_numtype1,double> > >
1784hypot(const Matrix<P_numtype1, P_struct1>& d1, double d2)
1785{
1786    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
1787        _bz_hypot<P_numtype1,double> > T_expr;
1788
1789    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
1790}
1791
1792template<class P_numtype1, class P_struct1>
1793inline
1794_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1795    _bz_hypot<P_numtype1,long double> > >
1796hypot(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
1797{
1798    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
1799        _bz_hypot<P_numtype1,long double> > T_expr;
1800
1801    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
1802}
1803
1804template<class P_numtype1, class P_struct1, class T2>
1805inline
1806_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1807    _bz_hypot<P_numtype1,complex<T2> > > >
1808hypot(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
1809{
1810    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
1811        _bz_hypot<P_numtype1,complex<T2> > > T_expr;
1812
1813    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
1814}
1815
1816template<class P_expr1, class P_numtype2, class P_struct2>
1817inline
1818_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1819    _bz_hypot<typename P_expr1::T_numtype,P_numtype2> > >
1820hypot(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
1821{
1822    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
1823        _bz_hypot<typename P_expr1::T_numtype,P_numtype2> > T_expr;
1824
1825    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
1826}
1827
1828template<class P_expr1, class P_expr2>
1829inline
1830_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1831    _bz_hypot<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
1832hypot(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
1833{
1834    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
1835        _bz_hypot<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
1836
1837    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
1838}
1839
1840template<class P_expr1>
1841inline
1842_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1843    _bz_hypot<typename P_expr1::T_numtype,int> > >
1844hypot(_bz_MatExpr<P_expr1> d1, int d2)
1845{
1846    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
1847        _bz_hypot<typename P_expr1::T_numtype,int> > T_expr;
1848
1849    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
1850}
1851
1852template<class P_expr1>
1853inline
1854_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1855    _bz_hypot<typename P_expr1::T_numtype,float> > >
1856hypot(_bz_MatExpr<P_expr1> d1, float d2)
1857{
1858    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
1859        _bz_hypot<typename P_expr1::T_numtype,float> > T_expr;
1860
1861    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
1862}
1863
1864template<class P_expr1>
1865inline
1866_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1867    _bz_hypot<typename P_expr1::T_numtype,double> > >
1868hypot(_bz_MatExpr<P_expr1> d1, double d2)
1869{
1870    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
1871        _bz_hypot<typename P_expr1::T_numtype,double> > T_expr;
1872
1873    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
1874}
1875
1876template<class P_expr1>
1877inline
1878_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1879    _bz_hypot<typename P_expr1::T_numtype,long double> > >
1880hypot(_bz_MatExpr<P_expr1> d1, long double d2)
1881{
1882    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
1883        _bz_hypot<typename P_expr1::T_numtype,long double> > T_expr;
1884
1885    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
1886}
1887
1888template<class P_expr1, class T2>
1889inline
1890_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1891    _bz_hypot<typename P_expr1::T_numtype,complex<T2> > > >
1892hypot(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
1893{
1894    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
1895        _bz_hypot<typename P_expr1::T_numtype,complex<T2> > > T_expr;
1896
1897    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
1898}
1899
1900template<class P_numtype2, class P_struct2>
1901inline
1902_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1903    _bz_hypot<int,P_numtype2> > >
1904hypot(int d1, const Matrix<P_numtype2, P_struct2>& d2)
1905{
1906    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
1907        _bz_hypot<int,P_numtype2> > T_expr;
1908
1909    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
1910}
1911
1912template<class P_expr2>
1913inline
1914_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1915    _bz_hypot<int,typename P_expr2::T_numtype> > >
1916hypot(int d1, _bz_MatExpr<P_expr2> d2)
1917{
1918    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
1919        _bz_hypot<int,typename P_expr2::T_numtype> > T_expr;
1920
1921    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
1922}
1923
1924template<class P_numtype2, class P_struct2>
1925inline
1926_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1927    _bz_hypot<float,P_numtype2> > >
1928hypot(float d1, const Matrix<P_numtype2, P_struct2>& d2)
1929{
1930    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
1931        _bz_hypot<float,P_numtype2> > T_expr;
1932
1933    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
1934}
1935
1936template<class P_expr2>
1937inline
1938_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1939    _bz_hypot<float,typename P_expr2::T_numtype> > >
1940hypot(float d1, _bz_MatExpr<P_expr2> d2)
1941{
1942    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
1943        _bz_hypot<float,typename P_expr2::T_numtype> > T_expr;
1944
1945    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
1946}
1947
1948template<class P_numtype2, class P_struct2>
1949inline
1950_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1951    _bz_hypot<double,P_numtype2> > >
1952hypot(double d1, const Matrix<P_numtype2, P_struct2>& d2)
1953{
1954    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1955        _bz_hypot<double,P_numtype2> > T_expr;
1956
1957    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
1958}
1959
1960template<class P_expr2>
1961inline
1962_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1963    _bz_hypot<double,typename P_expr2::T_numtype> > >
1964hypot(double d1, _bz_MatExpr<P_expr2> d2)
1965{
1966    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
1967        _bz_hypot<double,typename P_expr2::T_numtype> > T_expr;
1968
1969    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
1970}
1971
1972template<class P_numtype2, class P_struct2>
1973inline
1974_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1975    _bz_hypot<long double,P_numtype2> > >
1976hypot(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
1977{
1978    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
1979        _bz_hypot<long double,P_numtype2> > T_expr;
1980
1981    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
1982}
1983
1984template<class P_expr2>
1985inline
1986_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1987    _bz_hypot<long double,typename P_expr2::T_numtype> > >
1988hypot(long double d1, _bz_MatExpr<P_expr2> d2)
1989{
1990    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
1991        _bz_hypot<long double,typename P_expr2::T_numtype> > T_expr;
1992
1993    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
1994}
1995
1996template<class T1, class P_numtype2, class P_struct2>
1997inline
1998_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
1999    _bz_hypot<complex<T1> ,P_numtype2> > >
2000hypot(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
2001{
2002    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
2003        _bz_hypot<complex<T1> ,P_numtype2> > T_expr;
2004
2005    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
2006}
2007
2008template<class T1, class P_expr2>
2009inline
2010_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2011    _bz_hypot<complex<T1> ,typename P_expr2::T_numtype> > >
2012hypot(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
2013{
2014    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2015        _bz_hypot<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
2016
2017    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
2018}
2019
2020#endif
2021
2022/****************************************************************************
2023 * ilogb
2024 ****************************************************************************/
2025
2026#ifdef BZ_HAVE_IEEE_MATH
2027template<class P_numtype1, class P_struct1>
2028inline
2029_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2030    _bz_ilogb<P_numtype1> > >
2031ilogb(const Matrix<P_numtype1, P_struct1>& d1)
2032{
2033    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2034        _bz_ilogb<P_numtype1> > T_expr;
2035
2036    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2037}
2038
2039template<class P_expr1>
2040inline
2041_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2042    _bz_ilogb<typename P_expr1::T_numtype> > >
2043ilogb(_bz_MatExpr<P_expr1> d1)
2044{
2045    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2046        _bz_ilogb<typename P_expr1::T_numtype> > T_expr;
2047
2048    return _bz_MatExpr<T_expr>(T_expr(d1));
2049}
2050
2051#endif
2052
2053/****************************************************************************
2054 * blitz_isnan
2055 ****************************************************************************/
2056
2057#ifdef BZ_HAVE_IEEE_MATH
2058template<class P_numtype1, class P_struct1>
2059inline
2060_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2061    _bz_blitz_isnan<P_numtype1> > >
2062blitz_isnan(const Matrix<P_numtype1, P_struct1>& d1)
2063{
2064    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2065        _bz_blitz_isnan<P_numtype1> > T_expr;
2066
2067    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2068}
2069
2070template<class P_expr1>
2071inline
2072_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2073    _bz_blitz_isnan<typename P_expr1::T_numtype> > >
2074blitz_isnan(_bz_MatExpr<P_expr1> d1)
2075{
2076    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2077        _bz_blitz_isnan<typename P_expr1::T_numtype> > T_expr;
2078
2079    return _bz_MatExpr<T_expr>(T_expr(d1));
2080}
2081
2082#endif
2083
2084/****************************************************************************
2085 * itrunc
2086 ****************************************************************************/
2087
2088#ifdef BZ_HAVE_SYSTEM_V_MATH
2089template<class P_numtype1, class P_struct1>
2090inline
2091_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2092    _bz_itrunc<P_numtype1> > >
2093itrunc(const Matrix<P_numtype1, P_struct1>& d1)
2094{
2095    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2096        _bz_itrunc<P_numtype1> > T_expr;
2097
2098    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2099}
2100
2101template<class P_expr1>
2102inline
2103_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2104    _bz_itrunc<typename P_expr1::T_numtype> > >
2105itrunc(_bz_MatExpr<P_expr1> d1)
2106{
2107    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2108        _bz_itrunc<typename P_expr1::T_numtype> > T_expr;
2109
2110    return _bz_MatExpr<T_expr>(T_expr(d1));
2111}
2112
2113#endif
2114
2115/****************************************************************************
2116 * j0
2117 ****************************************************************************/
2118
2119#ifdef BZ_HAVE_IEEE_MATH
2120template<class P_numtype1, class P_struct1>
2121inline
2122_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2123    _bz_j0<P_numtype1> > >
2124j0(const Matrix<P_numtype1, P_struct1>& d1)
2125{
2126    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2127        _bz_j0<P_numtype1> > T_expr;
2128
2129    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2130}
2131
2132template<class P_expr1>
2133inline
2134_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2135    _bz_j0<typename P_expr1::T_numtype> > >
2136j0(_bz_MatExpr<P_expr1> d1)
2137{
2138    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2139        _bz_j0<typename P_expr1::T_numtype> > T_expr;
2140
2141    return _bz_MatExpr<T_expr>(T_expr(d1));
2142}
2143
2144#endif
2145
2146/****************************************************************************
2147 * j1
2148 ****************************************************************************/
2149
2150#ifdef BZ_HAVE_IEEE_MATH
2151template<class P_numtype1, class P_struct1>
2152inline
2153_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2154    _bz_j1<P_numtype1> > >
2155j1(const Matrix<P_numtype1, P_struct1>& d1)
2156{
2157    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2158        _bz_j1<P_numtype1> > T_expr;
2159
2160    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2161}
2162
2163template<class P_expr1>
2164inline
2165_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2166    _bz_j1<typename P_expr1::T_numtype> > >
2167j1(_bz_MatExpr<P_expr1> d1)
2168{
2169    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2170        _bz_j1<typename P_expr1::T_numtype> > T_expr;
2171
2172    return _bz_MatExpr<T_expr>(T_expr(d1));
2173}
2174
2175#endif
2176
2177/****************************************************************************
2178 * lgamma
2179 ****************************************************************************/
2180
2181#ifdef BZ_HAVE_IEEE_MATH
2182template<class P_numtype1, class P_struct1>
2183inline
2184_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2185    _bz_lgamma<P_numtype1> > >
2186lgamma(const Matrix<P_numtype1, P_struct1>& d1)
2187{
2188    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2189        _bz_lgamma<P_numtype1> > T_expr;
2190
2191    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2192}
2193
2194template<class P_expr1>
2195inline
2196_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2197    _bz_lgamma<typename P_expr1::T_numtype> > >
2198lgamma(_bz_MatExpr<P_expr1> d1)
2199{
2200    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2201        _bz_lgamma<typename P_expr1::T_numtype> > T_expr;
2202
2203    return _bz_MatExpr<T_expr>(T_expr(d1));
2204}
2205
2206#endif
2207
2208/****************************************************************************
2209 * log
2210 ****************************************************************************/
2211
2212template<class P_numtype1, class P_struct1>
2213inline
2214_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2215    _bz_log<P_numtype1> > >
2216log(const Matrix<P_numtype1, P_struct1>& d1)
2217{
2218    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2219        _bz_log<P_numtype1> > T_expr;
2220
2221    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2222}
2223
2224template<class P_expr1>
2225inline
2226_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2227    _bz_log<typename P_expr1::T_numtype> > >
2228log(_bz_MatExpr<P_expr1> d1)
2229{
2230    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2231        _bz_log<typename P_expr1::T_numtype> > T_expr;
2232
2233    return _bz_MatExpr<T_expr>(T_expr(d1));
2234}
2235
2236
2237/****************************************************************************
2238 * logb
2239 ****************************************************************************/
2240
2241#ifdef BZ_HAVE_IEEE_MATH
2242template<class P_numtype1, class P_struct1>
2243inline
2244_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2245    _bz_logb<P_numtype1> > >
2246logb(const Matrix<P_numtype1, P_struct1>& d1)
2247{
2248    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2249        _bz_logb<P_numtype1> > T_expr;
2250
2251    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2252}
2253
2254template<class P_expr1>
2255inline
2256_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2257    _bz_logb<typename P_expr1::T_numtype> > >
2258logb(_bz_MatExpr<P_expr1> d1)
2259{
2260    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2261        _bz_logb<typename P_expr1::T_numtype> > T_expr;
2262
2263    return _bz_MatExpr<T_expr>(T_expr(d1));
2264}
2265
2266#endif
2267
2268/****************************************************************************
2269 * log1p
2270 ****************************************************************************/
2271
2272#ifdef BZ_HAVE_IEEE_MATH
2273template<class P_numtype1, class P_struct1>
2274inline
2275_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2276    _bz_log1p<P_numtype1> > >
2277log1p(const Matrix<P_numtype1, P_struct1>& d1)
2278{
2279    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2280        _bz_log1p<P_numtype1> > T_expr;
2281
2282    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2283}
2284
2285template<class P_expr1>
2286inline
2287_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2288    _bz_log1p<typename P_expr1::T_numtype> > >
2289log1p(_bz_MatExpr<P_expr1> d1)
2290{
2291    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2292        _bz_log1p<typename P_expr1::T_numtype> > T_expr;
2293
2294    return _bz_MatExpr<T_expr>(T_expr(d1));
2295}
2296
2297#endif
2298
2299/****************************************************************************
2300 * log10
2301 ****************************************************************************/
2302
2303template<class P_numtype1, class P_struct1>
2304inline
2305_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2306    _bz_log10<P_numtype1> > >
2307log10(const Matrix<P_numtype1, P_struct1>& d1)
2308{
2309    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2310        _bz_log10<P_numtype1> > T_expr;
2311
2312    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2313}
2314
2315template<class P_expr1>
2316inline
2317_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2318    _bz_log10<typename P_expr1::T_numtype> > >
2319log10(_bz_MatExpr<P_expr1> d1)
2320{
2321    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2322        _bz_log10<typename P_expr1::T_numtype> > T_expr;
2323
2324    return _bz_MatExpr<T_expr>(T_expr(d1));
2325}
2326
2327
2328/****************************************************************************
2329 * nearest
2330 ****************************************************************************/
2331
2332#ifdef BZ_HAVE_SYSTEM_V_MATH
2333template<class P_numtype1, class P_struct1>
2334inline
2335_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2336    _bz_nearest<P_numtype1> > >
2337nearest(const Matrix<P_numtype1, P_struct1>& d1)
2338{
2339    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
2340        _bz_nearest<P_numtype1> > T_expr;
2341
2342    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
2343}
2344
2345template<class P_expr1>
2346inline
2347_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2348    _bz_nearest<typename P_expr1::T_numtype> > >
2349nearest(_bz_MatExpr<P_expr1> d1)
2350{
2351    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
2352        _bz_nearest<typename P_expr1::T_numtype> > T_expr;
2353
2354    return _bz_MatExpr<T_expr>(T_expr(d1));
2355}
2356
2357#endif
2358
2359/****************************************************************************
2360 * nextafter
2361 ****************************************************************************/
2362
2363#ifdef BZ_HAVE_SYSTEM_V_MATH
2364template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
2365inline
2366_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2367    _bz_nextafter<P_numtype1,P_numtype2> > >
2368nextafter(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
2369{
2370    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2371        _bz_nextafter<P_numtype1,P_numtype2> > T_expr;
2372
2373    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
2374}
2375
2376template<class P_numtype1, class P_struct1, class P_expr2>
2377inline
2378_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2379    _bz_nextafter<P_numtype1,typename P_expr2::T_numtype> > >
2380nextafter(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
2381{
2382    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2383        _bz_nextafter<P_numtype1,typename P_expr2::T_numtype> > T_expr;
2384
2385    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
2386}
2387
2388template<class P_numtype1, class P_struct1>
2389inline
2390_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2391    _bz_nextafter<P_numtype1,int> > >
2392nextafter(const Matrix<P_numtype1, P_struct1>& d1, int d2)
2393{
2394    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2395        _bz_nextafter<P_numtype1,int> > T_expr;
2396
2397    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
2398}
2399
2400template<class P_numtype1, class P_struct1>
2401inline
2402_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2403    _bz_nextafter<P_numtype1,float> > >
2404nextafter(const Matrix<P_numtype1, P_struct1>& d1, float d2)
2405{
2406    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2407        _bz_nextafter<P_numtype1,float> > T_expr;
2408
2409    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
2410}
2411
2412template<class P_numtype1, class P_struct1>
2413inline
2414_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
2415    _bz_nextafter<P_numtype1,double> > >
2416nextafter(const Matrix<P_numtype1, P_struct1>& d1, double d2)
2417{
2418    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
2419        _bz_nextafter<P_numtype1,double> > T_expr;
2420
2421    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
2422}
2423
2424template<class P_numtype1, class P_struct1>
2425inline
2426_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
2427    _bz_nextafter<P_numtype1,long double> > >
2428nextafter(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
2429{
2430    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
2431        _bz_nextafter<P_numtype1,long double> > T_expr;
2432
2433    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
2434}
2435
2436template<class P_numtype1, class P_struct1, class T2>
2437inline
2438_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
2439    _bz_nextafter<P_numtype1,complex<T2> > > >
2440nextafter(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
2441{
2442    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
2443        _bz_nextafter<P_numtype1,complex<T2> > > T_expr;
2444
2445    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
2446}
2447
2448template<class P_expr1, class P_numtype2, class P_struct2>
2449inline
2450_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2451    _bz_nextafter<typename P_expr1::T_numtype,P_numtype2> > >
2452nextafter(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
2453{
2454    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2455        _bz_nextafter<typename P_expr1::T_numtype,P_numtype2> > T_expr;
2456
2457    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
2458}
2459
2460template<class P_expr1, class P_expr2>
2461inline
2462_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
2463    _bz_nextafter<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
2464nextafter(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
2465{
2466    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
2467        _bz_nextafter<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
2468
2469    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
2470}
2471
2472template<class P_expr1>
2473inline
2474_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
2475    _bz_nextafter<typename P_expr1::T_numtype,int> > >
2476nextafter(_bz_MatExpr<P_expr1> d1, int d2)
2477{
2478    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
2479        _bz_nextafter<typename P_expr1::T_numtype,int> > T_expr;
2480
2481    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
2482}
2483
2484template<class P_expr1>
2485inline
2486_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
2487    _bz_nextafter<typename P_expr1::T_numtype,float> > >
2488nextafter(_bz_MatExpr<P_expr1> d1, float d2)
2489{
2490    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
2491        _bz_nextafter<typename P_expr1::T_numtype,float> > T_expr;
2492
2493    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
2494}
2495
2496template<class P_expr1>
2497inline
2498_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
2499    _bz_nextafter<typename P_expr1::T_numtype,double> > >
2500nextafter(_bz_MatExpr<P_expr1> d1, double d2)
2501{
2502    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
2503        _bz_nextafter<typename P_expr1::T_numtype,double> > T_expr;
2504
2505    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
2506}
2507
2508template<class P_expr1>
2509inline
2510_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
2511    _bz_nextafter<typename P_expr1::T_numtype,long double> > >
2512nextafter(_bz_MatExpr<P_expr1> d1, long double d2)
2513{
2514    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
2515        _bz_nextafter<typename P_expr1::T_numtype,long double> > T_expr;
2516
2517    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
2518}
2519
2520template<class P_expr1, class T2>
2521inline
2522_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
2523    _bz_nextafter<typename P_expr1::T_numtype,complex<T2> > > >
2524nextafter(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
2525{
2526    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
2527        _bz_nextafter<typename P_expr1::T_numtype,complex<T2> > > T_expr;
2528
2529    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
2530}
2531
2532template<class P_numtype2, class P_struct2>
2533inline
2534_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
2535    _bz_nextafter<int,P_numtype2> > >
2536nextafter(int d1, const Matrix<P_numtype2, P_struct2>& d2)
2537{
2538    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
2539        _bz_nextafter<int,P_numtype2> > T_expr;
2540
2541    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
2542}
2543
2544template<class P_expr2>
2545inline
2546_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
2547    _bz_nextafter<int,typename P_expr2::T_numtype> > >
2548nextafter(int d1, _bz_MatExpr<P_expr2> d2)
2549{
2550    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
2551        _bz_nextafter<int,typename P_expr2::T_numtype> > T_expr;
2552
2553    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
2554}
2555
2556template<class P_numtype2, class P_struct2>
2557inline
2558_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
2559    _bz_nextafter<float,P_numtype2> > >
2560nextafter(float d1, const Matrix<P_numtype2, P_struct2>& d2)
2561{
2562    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
2563        _bz_nextafter<float,P_numtype2> > T_expr;
2564
2565    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
2566}
2567
2568template<class P_expr2>
2569inline
2570_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
2571    _bz_nextafter<float,typename P_expr2::T_numtype> > >
2572nextafter(float d1, _bz_MatExpr<P_expr2> d2)
2573{
2574    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
2575        _bz_nextafter<float,typename P_expr2::T_numtype> > T_expr;
2576
2577    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
2578}
2579
2580template<class P_numtype2, class P_struct2>
2581inline
2582_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2583    _bz_nextafter<double,P_numtype2> > >
2584nextafter(double d1, const Matrix<P_numtype2, P_struct2>& d2)
2585{
2586    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2587        _bz_nextafter<double,P_numtype2> > T_expr;
2588
2589    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
2590}
2591
2592template<class P_expr2>
2593inline
2594_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
2595    _bz_nextafter<double,typename P_expr2::T_numtype> > >
2596nextafter(double d1, _bz_MatExpr<P_expr2> d2)
2597{
2598    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
2599        _bz_nextafter<double,typename P_expr2::T_numtype> > T_expr;
2600
2601    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
2602}
2603
2604template<class P_numtype2, class P_struct2>
2605inline
2606_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2607    _bz_nextafter<long double,P_numtype2> > >
2608nextafter(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
2609{
2610    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2611        _bz_nextafter<long double,P_numtype2> > T_expr;
2612
2613    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
2614}
2615
2616template<class P_expr2>
2617inline
2618_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
2619    _bz_nextafter<long double,typename P_expr2::T_numtype> > >
2620nextafter(long double d1, _bz_MatExpr<P_expr2> d2)
2621{
2622    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
2623        _bz_nextafter<long double,typename P_expr2::T_numtype> > T_expr;
2624
2625    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
2626}
2627
2628template<class T1, class P_numtype2, class P_struct2>
2629inline
2630_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
2631    _bz_nextafter<complex<T1> ,P_numtype2> > >
2632nextafter(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
2633{
2634    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
2635        _bz_nextafter<complex<T1> ,P_numtype2> > T_expr;
2636
2637    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
2638}
2639
2640template<class T1, class P_expr2>
2641inline
2642_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2643    _bz_nextafter<complex<T1> ,typename P_expr2::T_numtype> > >
2644nextafter(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
2645{
2646    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2647        _bz_nextafter<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
2648
2649    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
2650}
2651
2652#endif
2653
2654/****************************************************************************
2655 * pow
2656 ****************************************************************************/
2657
2658template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
2659inline
2660_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2661    _bz_pow<P_numtype1,P_numtype2> > >
2662pow(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
2663{
2664    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2665        _bz_pow<P_numtype1,P_numtype2> > T_expr;
2666
2667    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
2668}
2669
2670template<class P_numtype1, class P_struct1, class P_expr2>
2671inline
2672_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2673    _bz_pow<P_numtype1,typename P_expr2::T_numtype> > >
2674pow(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
2675{
2676    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2677        _bz_pow<P_numtype1,typename P_expr2::T_numtype> > T_expr;
2678
2679    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
2680}
2681
2682template<class P_numtype1, class P_struct1>
2683inline
2684_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2685    _bz_pow<P_numtype1,int> > >
2686pow(const Matrix<P_numtype1, P_struct1>& d1, int d2)
2687{
2688    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2689        _bz_pow<P_numtype1,int> > T_expr;
2690
2691    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
2692}
2693
2694template<class P_numtype1, class P_struct1>
2695inline
2696_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2697    _bz_pow<P_numtype1,float> > >
2698pow(const Matrix<P_numtype1, P_struct1>& d1, float d2)
2699{
2700    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2701        _bz_pow<P_numtype1,float> > T_expr;
2702
2703    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
2704}
2705
2706template<class P_numtype1, class P_struct1>
2707inline
2708_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
2709    _bz_pow<P_numtype1,double> > >
2710pow(const Matrix<P_numtype1, P_struct1>& d1, double d2)
2711{
2712    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
2713        _bz_pow<P_numtype1,double> > T_expr;
2714
2715    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
2716}
2717
2718template<class P_numtype1, class P_struct1>
2719inline
2720_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
2721    _bz_pow<P_numtype1,long double> > >
2722pow(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
2723{
2724    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
2725        _bz_pow<P_numtype1,long double> > T_expr;
2726
2727    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
2728}
2729
2730template<class P_numtype1, class P_struct1, class T2>
2731inline
2732_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
2733    _bz_pow<P_numtype1,complex<T2> > > >
2734pow(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
2735{
2736    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
2737        _bz_pow<P_numtype1,complex<T2> > > T_expr;
2738
2739    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
2740}
2741
2742template<class P_expr1, class P_numtype2, class P_struct2>
2743inline
2744_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2745    _bz_pow<typename P_expr1::T_numtype,P_numtype2> > >
2746pow(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
2747{
2748    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2749        _bz_pow<typename P_expr1::T_numtype,P_numtype2> > T_expr;
2750
2751    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
2752}
2753
2754template<class P_expr1, class P_expr2>
2755inline
2756_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
2757    _bz_pow<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
2758pow(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
2759{
2760    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
2761        _bz_pow<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
2762
2763    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
2764}
2765
2766template<class P_expr1>
2767inline
2768_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
2769    _bz_pow<typename P_expr1::T_numtype,int> > >
2770pow(_bz_MatExpr<P_expr1> d1, int d2)
2771{
2772    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
2773        _bz_pow<typename P_expr1::T_numtype,int> > T_expr;
2774
2775    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
2776}
2777
2778template<class P_expr1>
2779inline
2780_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
2781    _bz_pow<typename P_expr1::T_numtype,float> > >
2782pow(_bz_MatExpr<P_expr1> d1, float d2)
2783{
2784    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
2785        _bz_pow<typename P_expr1::T_numtype,float> > T_expr;
2786
2787    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
2788}
2789
2790template<class P_expr1>
2791inline
2792_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
2793    _bz_pow<typename P_expr1::T_numtype,double> > >
2794pow(_bz_MatExpr<P_expr1> d1, double d2)
2795{
2796    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
2797        _bz_pow<typename P_expr1::T_numtype,double> > T_expr;
2798
2799    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
2800}
2801
2802template<class P_expr1>
2803inline
2804_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
2805    _bz_pow<typename P_expr1::T_numtype,long double> > >
2806pow(_bz_MatExpr<P_expr1> d1, long double d2)
2807{
2808    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
2809        _bz_pow<typename P_expr1::T_numtype,long double> > T_expr;
2810
2811    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
2812}
2813
2814template<class P_expr1, class T2>
2815inline
2816_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
2817    _bz_pow<typename P_expr1::T_numtype,complex<T2> > > >
2818pow(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
2819{
2820    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
2821        _bz_pow<typename P_expr1::T_numtype,complex<T2> > > T_expr;
2822
2823    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
2824}
2825
2826template<class P_numtype2, class P_struct2>
2827inline
2828_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
2829    _bz_pow<int,P_numtype2> > >
2830pow(int d1, const Matrix<P_numtype2, P_struct2>& d2)
2831{
2832    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
2833        _bz_pow<int,P_numtype2> > T_expr;
2834
2835    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
2836}
2837
2838template<class P_expr2>
2839inline
2840_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
2841    _bz_pow<int,typename P_expr2::T_numtype> > >
2842pow(int d1, _bz_MatExpr<P_expr2> d2)
2843{
2844    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
2845        _bz_pow<int,typename P_expr2::T_numtype> > T_expr;
2846
2847    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
2848}
2849
2850template<class P_numtype2, class P_struct2>
2851inline
2852_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
2853    _bz_pow<float,P_numtype2> > >
2854pow(float d1, const Matrix<P_numtype2, P_struct2>& d2)
2855{
2856    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
2857        _bz_pow<float,P_numtype2> > T_expr;
2858
2859    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
2860}
2861
2862template<class P_expr2>
2863inline
2864_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
2865    _bz_pow<float,typename P_expr2::T_numtype> > >
2866pow(float d1, _bz_MatExpr<P_expr2> d2)
2867{
2868    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
2869        _bz_pow<float,typename P_expr2::T_numtype> > T_expr;
2870
2871    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
2872}
2873
2874template<class P_numtype2, class P_struct2>
2875inline
2876_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2877    _bz_pow<double,P_numtype2> > >
2878pow(double d1, const Matrix<P_numtype2, P_struct2>& d2)
2879{
2880    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2881        _bz_pow<double,P_numtype2> > T_expr;
2882
2883    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
2884}
2885
2886template<class P_expr2>
2887inline
2888_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
2889    _bz_pow<double,typename P_expr2::T_numtype> > >
2890pow(double d1, _bz_MatExpr<P_expr2> d2)
2891{
2892    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
2893        _bz_pow<double,typename P_expr2::T_numtype> > T_expr;
2894
2895    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
2896}
2897
2898template<class P_numtype2, class P_struct2>
2899inline
2900_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2901    _bz_pow<long double,P_numtype2> > >
2902pow(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
2903{
2904    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
2905        _bz_pow<long double,P_numtype2> > T_expr;
2906
2907    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
2908}
2909
2910template<class P_expr2>
2911inline
2912_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
2913    _bz_pow<long double,typename P_expr2::T_numtype> > >
2914pow(long double d1, _bz_MatExpr<P_expr2> d2)
2915{
2916    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
2917        _bz_pow<long double,typename P_expr2::T_numtype> > T_expr;
2918
2919    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
2920}
2921
2922template<class T1, class P_numtype2, class P_struct2>
2923inline
2924_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
2925    _bz_pow<complex<T1> ,P_numtype2> > >
2926pow(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
2927{
2928    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
2929        _bz_pow<complex<T1> ,P_numtype2> > T_expr;
2930
2931    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
2932}
2933
2934template<class T1, class P_expr2>
2935inline
2936_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2937    _bz_pow<complex<T1> ,typename P_expr2::T_numtype> > >
2938pow(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
2939{
2940    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
2941        _bz_pow<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
2942
2943    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
2944}
2945
2946
2947/****************************************************************************
2948 * remainder
2949 ****************************************************************************/
2950
2951#ifdef BZ_HAVE_SYSTEM_V_MATH
2952template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
2953inline
2954_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2955    _bz_remainder<P_numtype1,P_numtype2> > >
2956remainder(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
2957{
2958    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
2959        _bz_remainder<P_numtype1,P_numtype2> > T_expr;
2960
2961    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
2962}
2963
2964template<class P_numtype1, class P_struct1, class P_expr2>
2965inline
2966_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2967    _bz_remainder<P_numtype1,typename P_expr2::T_numtype> > >
2968remainder(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
2969{
2970    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
2971        _bz_remainder<P_numtype1,typename P_expr2::T_numtype> > T_expr;
2972
2973    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
2974}
2975
2976template<class P_numtype1, class P_struct1>
2977inline
2978_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2979    _bz_remainder<P_numtype1,int> > >
2980remainder(const Matrix<P_numtype1, P_struct1>& d1, int d2)
2981{
2982    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
2983        _bz_remainder<P_numtype1,int> > T_expr;
2984
2985    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
2986}
2987
2988template<class P_numtype1, class P_struct1>
2989inline
2990_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2991    _bz_remainder<P_numtype1,float> > >
2992remainder(const Matrix<P_numtype1, P_struct1>& d1, float d2)
2993{
2994    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
2995        _bz_remainder<P_numtype1,float> > T_expr;
2996
2997    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
2998}
2999
3000template<class P_numtype1, class P_struct1>
3001inline
3002_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3003    _bz_remainder<P_numtype1,double> > >
3004remainder(const Matrix<P_numtype1, P_struct1>& d1, double d2)
3005{
3006    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3007        _bz_remainder<P_numtype1,double> > T_expr;
3008
3009    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
3010}
3011
3012template<class P_numtype1, class P_struct1>
3013inline
3014_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3015    _bz_remainder<P_numtype1,long double> > >
3016remainder(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
3017{
3018    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3019        _bz_remainder<P_numtype1,long double> > T_expr;
3020
3021    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
3022}
3023
3024template<class P_numtype1, class P_struct1, class T2>
3025inline
3026_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3027    _bz_remainder<P_numtype1,complex<T2> > > >
3028remainder(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
3029{
3030    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3031        _bz_remainder<P_numtype1,complex<T2> > > T_expr;
3032
3033    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
3034}
3035
3036template<class P_expr1, class P_numtype2, class P_struct2>
3037inline
3038_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3039    _bz_remainder<typename P_expr1::T_numtype,P_numtype2> > >
3040remainder(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
3041{
3042    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3043        _bz_remainder<typename P_expr1::T_numtype,P_numtype2> > T_expr;
3044
3045    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
3046}
3047
3048template<class P_expr1, class P_expr2>
3049inline
3050_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3051    _bz_remainder<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3052remainder(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
3053{
3054    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3055        _bz_remainder<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
3056
3057    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
3058}
3059
3060template<class P_expr1>
3061inline
3062_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3063    _bz_remainder<typename P_expr1::T_numtype,int> > >
3064remainder(_bz_MatExpr<P_expr1> d1, int d2)
3065{
3066    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3067        _bz_remainder<typename P_expr1::T_numtype,int> > T_expr;
3068
3069    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
3070}
3071
3072template<class P_expr1>
3073inline
3074_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3075    _bz_remainder<typename P_expr1::T_numtype,float> > >
3076remainder(_bz_MatExpr<P_expr1> d1, float d2)
3077{
3078    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3079        _bz_remainder<typename P_expr1::T_numtype,float> > T_expr;
3080
3081    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
3082}
3083
3084template<class P_expr1>
3085inline
3086_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3087    _bz_remainder<typename P_expr1::T_numtype,double> > >
3088remainder(_bz_MatExpr<P_expr1> d1, double d2)
3089{
3090    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3091        _bz_remainder<typename P_expr1::T_numtype,double> > T_expr;
3092
3093    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
3094}
3095
3096template<class P_expr1>
3097inline
3098_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3099    _bz_remainder<typename P_expr1::T_numtype,long double> > >
3100remainder(_bz_MatExpr<P_expr1> d1, long double d2)
3101{
3102    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3103        _bz_remainder<typename P_expr1::T_numtype,long double> > T_expr;
3104
3105    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
3106}
3107
3108template<class P_expr1, class T2>
3109inline
3110_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3111    _bz_remainder<typename P_expr1::T_numtype,complex<T2> > > >
3112remainder(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
3113{
3114    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3115        _bz_remainder<typename P_expr1::T_numtype,complex<T2> > > T_expr;
3116
3117    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
3118}
3119
3120template<class P_numtype2, class P_struct2>
3121inline
3122_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3123    _bz_remainder<int,P_numtype2> > >
3124remainder(int d1, const Matrix<P_numtype2, P_struct2>& d2)
3125{
3126    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3127        _bz_remainder<int,P_numtype2> > T_expr;
3128
3129    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
3130}
3131
3132template<class P_expr2>
3133inline
3134_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3135    _bz_remainder<int,typename P_expr2::T_numtype> > >
3136remainder(int d1, _bz_MatExpr<P_expr2> d2)
3137{
3138    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3139        _bz_remainder<int,typename P_expr2::T_numtype> > T_expr;
3140
3141    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
3142}
3143
3144template<class P_numtype2, class P_struct2>
3145inline
3146_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
3147    _bz_remainder<float,P_numtype2> > >
3148remainder(float d1, const Matrix<P_numtype2, P_struct2>& d2)
3149{
3150    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
3151        _bz_remainder<float,P_numtype2> > T_expr;
3152
3153    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
3154}
3155
3156template<class P_expr2>
3157inline
3158_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
3159    _bz_remainder<float,typename P_expr2::T_numtype> > >
3160remainder(float d1, _bz_MatExpr<P_expr2> d2)
3161{
3162    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
3163        _bz_remainder<float,typename P_expr2::T_numtype> > T_expr;
3164
3165    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
3166}
3167
3168template<class P_numtype2, class P_struct2>
3169inline
3170_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3171    _bz_remainder<double,P_numtype2> > >
3172remainder(double d1, const Matrix<P_numtype2, P_struct2>& d2)
3173{
3174    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3175        _bz_remainder<double,P_numtype2> > T_expr;
3176
3177    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
3178}
3179
3180template<class P_expr2>
3181inline
3182_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
3183    _bz_remainder<double,typename P_expr2::T_numtype> > >
3184remainder(double d1, _bz_MatExpr<P_expr2> d2)
3185{
3186    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
3187        _bz_remainder<double,typename P_expr2::T_numtype> > T_expr;
3188
3189    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
3190}
3191
3192template<class P_numtype2, class P_struct2>
3193inline
3194_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3195    _bz_remainder<long double,P_numtype2> > >
3196remainder(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
3197{
3198    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3199        _bz_remainder<long double,P_numtype2> > T_expr;
3200
3201    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
3202}
3203
3204template<class P_expr2>
3205inline
3206_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
3207    _bz_remainder<long double,typename P_expr2::T_numtype> > >
3208remainder(long double d1, _bz_MatExpr<P_expr2> d2)
3209{
3210    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
3211        _bz_remainder<long double,typename P_expr2::T_numtype> > T_expr;
3212
3213    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
3214}
3215
3216template<class T1, class P_numtype2, class P_struct2>
3217inline
3218_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
3219    _bz_remainder<complex<T1> ,P_numtype2> > >
3220remainder(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
3221{
3222    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
3223        _bz_remainder<complex<T1> ,P_numtype2> > T_expr;
3224
3225    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
3226}
3227
3228template<class T1, class P_expr2>
3229inline
3230_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
3231    _bz_remainder<complex<T1> ,typename P_expr2::T_numtype> > >
3232remainder(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
3233{
3234    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
3235        _bz_remainder<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
3236
3237    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
3238}
3239
3240#endif
3241
3242/****************************************************************************
3243 * rint
3244 ****************************************************************************/
3245
3246#ifdef BZ_HAVE_IEEE_MATH
3247template<class P_numtype1, class P_struct1>
3248inline
3249_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3250    _bz_rint<P_numtype1> > >
3251rint(const Matrix<P_numtype1, P_struct1>& d1)
3252{
3253    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3254        _bz_rint<P_numtype1> > T_expr;
3255
3256    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3257}
3258
3259template<class P_expr1>
3260inline
3261_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3262    _bz_rint<typename P_expr1::T_numtype> > >
3263rint(_bz_MatExpr<P_expr1> d1)
3264{
3265    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3266        _bz_rint<typename P_expr1::T_numtype> > T_expr;
3267
3268    return _bz_MatExpr<T_expr>(T_expr(d1));
3269}
3270
3271#endif
3272
3273/****************************************************************************
3274 * rsqrt
3275 ****************************************************************************/
3276
3277#ifdef BZ_HAVE_SYSTEM_V_MATH
3278template<class P_numtype1, class P_struct1>
3279inline
3280_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3281    _bz_rsqrt<P_numtype1> > >
3282rsqrt(const Matrix<P_numtype1, P_struct1>& d1)
3283{
3284    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3285        _bz_rsqrt<P_numtype1> > T_expr;
3286
3287    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3288}
3289
3290template<class P_expr1>
3291inline
3292_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3293    _bz_rsqrt<typename P_expr1::T_numtype> > >
3294rsqrt(_bz_MatExpr<P_expr1> d1)
3295{
3296    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3297        _bz_rsqrt<typename P_expr1::T_numtype> > T_expr;
3298
3299    return _bz_MatExpr<T_expr>(T_expr(d1));
3300}
3301
3302#endif
3303
3304/****************************************************************************
3305 * scalb
3306 ****************************************************************************/
3307
3308#ifdef BZ_HAVE_SYSTEM_V_MATH
3309template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
3310inline
3311_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3312    _bz_scalb<P_numtype1,P_numtype2> > >
3313scalb(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
3314{
3315    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3316        _bz_scalb<P_numtype1,P_numtype2> > T_expr;
3317
3318    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
3319}
3320
3321template<class P_numtype1, class P_struct1, class P_expr2>
3322inline
3323_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
3324    _bz_scalb<P_numtype1,typename P_expr2::T_numtype> > >
3325scalb(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
3326{
3327    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
3328        _bz_scalb<P_numtype1,typename P_expr2::T_numtype> > T_expr;
3329
3330    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
3331}
3332
3333template<class P_numtype1, class P_struct1>
3334inline
3335_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
3336    _bz_scalb<P_numtype1,int> > >
3337scalb(const Matrix<P_numtype1, P_struct1>& d1, int d2)
3338{
3339    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
3340        _bz_scalb<P_numtype1,int> > T_expr;
3341
3342    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
3343}
3344
3345template<class P_numtype1, class P_struct1>
3346inline
3347_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
3348    _bz_scalb<P_numtype1,float> > >
3349scalb(const Matrix<P_numtype1, P_struct1>& d1, float d2)
3350{
3351    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
3352        _bz_scalb<P_numtype1,float> > T_expr;
3353
3354    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
3355}
3356
3357template<class P_numtype1, class P_struct1>
3358inline
3359_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3360    _bz_scalb<P_numtype1,double> > >
3361scalb(const Matrix<P_numtype1, P_struct1>& d1, double d2)
3362{
3363    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3364        _bz_scalb<P_numtype1,double> > T_expr;
3365
3366    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
3367}
3368
3369template<class P_numtype1, class P_struct1>
3370inline
3371_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3372    _bz_scalb<P_numtype1,long double> > >
3373scalb(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
3374{
3375    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3376        _bz_scalb<P_numtype1,long double> > T_expr;
3377
3378    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
3379}
3380
3381template<class P_numtype1, class P_struct1, class T2>
3382inline
3383_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3384    _bz_scalb<P_numtype1,complex<T2> > > >
3385scalb(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
3386{
3387    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3388        _bz_scalb<P_numtype1,complex<T2> > > T_expr;
3389
3390    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
3391}
3392
3393template<class P_expr1, class P_numtype2, class P_struct2>
3394inline
3395_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3396    _bz_scalb<typename P_expr1::T_numtype,P_numtype2> > >
3397scalb(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
3398{
3399    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3400        _bz_scalb<typename P_expr1::T_numtype,P_numtype2> > T_expr;
3401
3402    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
3403}
3404
3405template<class P_expr1, class P_expr2>
3406inline
3407_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3408    _bz_scalb<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3409scalb(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
3410{
3411    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3412        _bz_scalb<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
3413
3414    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
3415}
3416
3417template<class P_expr1>
3418inline
3419_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3420    _bz_scalb<typename P_expr1::T_numtype,int> > >
3421scalb(_bz_MatExpr<P_expr1> d1, int d2)
3422{
3423    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3424        _bz_scalb<typename P_expr1::T_numtype,int> > T_expr;
3425
3426    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
3427}
3428
3429template<class P_expr1>
3430inline
3431_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3432    _bz_scalb<typename P_expr1::T_numtype,float> > >
3433scalb(_bz_MatExpr<P_expr1> d1, float d2)
3434{
3435    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3436        _bz_scalb<typename P_expr1::T_numtype,float> > T_expr;
3437
3438    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
3439}
3440
3441template<class P_expr1>
3442inline
3443_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3444    _bz_scalb<typename P_expr1::T_numtype,double> > >
3445scalb(_bz_MatExpr<P_expr1> d1, double d2)
3446{
3447    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3448        _bz_scalb<typename P_expr1::T_numtype,double> > T_expr;
3449
3450    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
3451}
3452
3453template<class P_expr1>
3454inline
3455_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3456    _bz_scalb<typename P_expr1::T_numtype,long double> > >
3457scalb(_bz_MatExpr<P_expr1> d1, long double d2)
3458{
3459    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3460        _bz_scalb<typename P_expr1::T_numtype,long double> > T_expr;
3461
3462    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
3463}
3464
3465template<class P_expr1, class T2>
3466inline
3467_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3468    _bz_scalb<typename P_expr1::T_numtype,complex<T2> > > >
3469scalb(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
3470{
3471    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3472        _bz_scalb<typename P_expr1::T_numtype,complex<T2> > > T_expr;
3473
3474    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
3475}
3476
3477template<class P_numtype2, class P_struct2>
3478inline
3479_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3480    _bz_scalb<int,P_numtype2> > >
3481scalb(int d1, const Matrix<P_numtype2, P_struct2>& d2)
3482{
3483    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3484        _bz_scalb<int,P_numtype2> > T_expr;
3485
3486    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
3487}
3488
3489template<class P_expr2>
3490inline
3491_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3492    _bz_scalb<int,typename P_expr2::T_numtype> > >
3493scalb(int d1, _bz_MatExpr<P_expr2> d2)
3494{
3495    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3496        _bz_scalb<int,typename P_expr2::T_numtype> > T_expr;
3497
3498    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
3499}
3500
3501template<class P_numtype2, class P_struct2>
3502inline
3503_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
3504    _bz_scalb<float,P_numtype2> > >
3505scalb(float d1, const Matrix<P_numtype2, P_struct2>& d2)
3506{
3507    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
3508        _bz_scalb<float,P_numtype2> > T_expr;
3509
3510    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
3511}
3512
3513template<class P_expr2>
3514inline
3515_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
3516    _bz_scalb<float,typename P_expr2::T_numtype> > >
3517scalb(float d1, _bz_MatExpr<P_expr2> d2)
3518{
3519    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
3520        _bz_scalb<float,typename P_expr2::T_numtype> > T_expr;
3521
3522    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
3523}
3524
3525template<class P_numtype2, class P_struct2>
3526inline
3527_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3528    _bz_scalb<double,P_numtype2> > >
3529scalb(double d1, const Matrix<P_numtype2, P_struct2>& d2)
3530{
3531    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3532        _bz_scalb<double,P_numtype2> > T_expr;
3533
3534    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
3535}
3536
3537template<class P_expr2>
3538inline
3539_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
3540    _bz_scalb<double,typename P_expr2::T_numtype> > >
3541scalb(double d1, _bz_MatExpr<P_expr2> d2)
3542{
3543    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
3544        _bz_scalb<double,typename P_expr2::T_numtype> > T_expr;
3545
3546    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
3547}
3548
3549template<class P_numtype2, class P_struct2>
3550inline
3551_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3552    _bz_scalb<long double,P_numtype2> > >
3553scalb(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
3554{
3555    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
3556        _bz_scalb<long double,P_numtype2> > T_expr;
3557
3558    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
3559}
3560
3561template<class P_expr2>
3562inline
3563_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
3564    _bz_scalb<long double,typename P_expr2::T_numtype> > >
3565scalb(long double d1, _bz_MatExpr<P_expr2> d2)
3566{
3567    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
3568        _bz_scalb<long double,typename P_expr2::T_numtype> > T_expr;
3569
3570    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
3571}
3572
3573template<class T1, class P_numtype2, class P_struct2>
3574inline
3575_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
3576    _bz_scalb<complex<T1> ,P_numtype2> > >
3577scalb(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
3578{
3579    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
3580        _bz_scalb<complex<T1> ,P_numtype2> > T_expr;
3581
3582    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
3583}
3584
3585template<class T1, class P_expr2>
3586inline
3587_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
3588    _bz_scalb<complex<T1> ,typename P_expr2::T_numtype> > >
3589scalb(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
3590{
3591    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
3592        _bz_scalb<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
3593
3594    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
3595}
3596
3597#endif
3598
3599/****************************************************************************
3600 * sin
3601 ****************************************************************************/
3602
3603template<class P_numtype1, class P_struct1>
3604inline
3605_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3606    _bz_sin<P_numtype1> > >
3607sin(const Matrix<P_numtype1, P_struct1>& d1)
3608{
3609    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3610        _bz_sin<P_numtype1> > T_expr;
3611
3612    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3613}
3614
3615template<class P_expr1>
3616inline
3617_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3618    _bz_sin<typename P_expr1::T_numtype> > >
3619sin(_bz_MatExpr<P_expr1> d1)
3620{
3621    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3622        _bz_sin<typename P_expr1::T_numtype> > T_expr;
3623
3624    return _bz_MatExpr<T_expr>(T_expr(d1));
3625}
3626
3627
3628/****************************************************************************
3629 * sinh
3630 ****************************************************************************/
3631
3632template<class P_numtype1, class P_struct1>
3633inline
3634_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3635    _bz_sinh<P_numtype1> > >
3636sinh(const Matrix<P_numtype1, P_struct1>& d1)
3637{
3638    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3639        _bz_sinh<P_numtype1> > T_expr;
3640
3641    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3642}
3643
3644template<class P_expr1>
3645inline
3646_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3647    _bz_sinh<typename P_expr1::T_numtype> > >
3648sinh(_bz_MatExpr<P_expr1> d1)
3649{
3650    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3651        _bz_sinh<typename P_expr1::T_numtype> > T_expr;
3652
3653    return _bz_MatExpr<T_expr>(T_expr(d1));
3654}
3655
3656
3657/****************************************************************************
3658 * sqr
3659 ****************************************************************************/
3660
3661template<class P_numtype1, class P_struct1>
3662inline
3663_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3664    _bz_sqr<P_numtype1> > >
3665sqr(const Matrix<P_numtype1, P_struct1>& d1)
3666{
3667    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3668        _bz_sqr<P_numtype1> > T_expr;
3669
3670    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3671}
3672
3673template<class P_expr1>
3674inline
3675_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3676    _bz_sqr<typename P_expr1::T_numtype> > >
3677sqr(_bz_MatExpr<P_expr1> d1)
3678{
3679    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3680        _bz_sqr<typename P_expr1::T_numtype> > T_expr;
3681
3682    return _bz_MatExpr<T_expr>(T_expr(d1));
3683}
3684
3685
3686/****************************************************************************
3687 * sqrt
3688 ****************************************************************************/
3689
3690template<class P_numtype1, class P_struct1>
3691inline
3692_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3693    _bz_sqrt<P_numtype1> > >
3694sqrt(const Matrix<P_numtype1, P_struct1>& d1)
3695{
3696    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3697        _bz_sqrt<P_numtype1> > T_expr;
3698
3699    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3700}
3701
3702template<class P_expr1>
3703inline
3704_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3705    _bz_sqrt<typename P_expr1::T_numtype> > >
3706sqrt(_bz_MatExpr<P_expr1> d1)
3707{
3708    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3709        _bz_sqrt<typename P_expr1::T_numtype> > T_expr;
3710
3711    return _bz_MatExpr<T_expr>(T_expr(d1));
3712}
3713
3714
3715/****************************************************************************
3716 * tan
3717 ****************************************************************************/
3718
3719template<class P_numtype1, class P_struct1>
3720inline
3721_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3722    _bz_tan<P_numtype1> > >
3723tan(const Matrix<P_numtype1, P_struct1>& d1)
3724{
3725    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3726        _bz_tan<P_numtype1> > T_expr;
3727
3728    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3729}
3730
3731template<class P_expr1>
3732inline
3733_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3734    _bz_tan<typename P_expr1::T_numtype> > >
3735tan(_bz_MatExpr<P_expr1> d1)
3736{
3737    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3738        _bz_tan<typename P_expr1::T_numtype> > T_expr;
3739
3740    return _bz_MatExpr<T_expr>(T_expr(d1));
3741}
3742
3743
3744/****************************************************************************
3745 * tanh
3746 ****************************************************************************/
3747
3748template<class P_numtype1, class P_struct1>
3749inline
3750_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3751    _bz_tanh<P_numtype1> > >
3752tanh(const Matrix<P_numtype1, P_struct1>& d1)
3753{
3754    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3755        _bz_tanh<P_numtype1> > T_expr;
3756
3757    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3758}
3759
3760template<class P_expr1>
3761inline
3762_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3763    _bz_tanh<typename P_expr1::T_numtype> > >
3764tanh(_bz_MatExpr<P_expr1> d1)
3765{
3766    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3767        _bz_tanh<typename P_expr1::T_numtype> > T_expr;
3768
3769    return _bz_MatExpr<T_expr>(T_expr(d1));
3770}
3771
3772
3773/****************************************************************************
3774 * uitrunc
3775 ****************************************************************************/
3776
3777#ifdef BZ_HAVE_SYSTEM_V_MATH
3778template<class P_numtype1, class P_struct1>
3779inline
3780_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3781    _bz_uitrunc<P_numtype1> > >
3782uitrunc(const Matrix<P_numtype1, P_struct1>& d1)
3783{
3784    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
3785        _bz_uitrunc<P_numtype1> > T_expr;
3786
3787    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
3788}
3789
3790template<class P_expr1>
3791inline
3792_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3793    _bz_uitrunc<typename P_expr1::T_numtype> > >
3794uitrunc(_bz_MatExpr<P_expr1> d1)
3795{
3796    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
3797        _bz_uitrunc<typename P_expr1::T_numtype> > T_expr;
3798
3799    return _bz_MatExpr<T_expr>(T_expr(d1));
3800}
3801
3802#endif
3803
3804/****************************************************************************
3805 * unordered
3806 ****************************************************************************/
3807
3808#ifdef BZ_HAVE_SYSTEM_V_MATH
3809template<class P_numtype1, class P_struct1, class P_numtype2, class P_struct2>
3810inline
3811_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3812    _bz_unordered<P_numtype1,P_numtype2> > >
3813unordered(const Matrix<P_numtype1, P_struct1>& d1, const Matrix<P_numtype2, P_struct2>& d2)
3814{
3815    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3816        _bz_unordered<P_numtype1,P_numtype2> > T_expr;
3817
3818    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2._bz_getRef()));
3819}
3820
3821template<class P_numtype1, class P_struct1, class P_expr2>
3822inline
3823_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
3824    _bz_unordered<P_numtype1,typename P_expr2::T_numtype> > >
3825unordered(const Matrix<P_numtype1, P_struct1>& d1, _bz_MatExpr<P_expr2> d2)
3826{
3827    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExpr<P_expr2>,
3828        _bz_unordered<P_numtype1,typename P_expr2::T_numtype> > T_expr;
3829
3830    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), d2));
3831}
3832
3833template<class P_numtype1, class P_struct1>
3834inline
3835_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
3836    _bz_unordered<P_numtype1,int> > >
3837unordered(const Matrix<P_numtype1, P_struct1>& d1, int d2)
3838{
3839    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<int>,
3840        _bz_unordered<P_numtype1,int> > T_expr;
3841
3842    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<int>(d2)));
3843}
3844
3845template<class P_numtype1, class P_struct1>
3846inline
3847_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
3848    _bz_unordered<P_numtype1,float> > >
3849unordered(const Matrix<P_numtype1, P_struct1>& d1, float d2)
3850{
3851    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<float>,
3852        _bz_unordered<P_numtype1,float> > T_expr;
3853
3854    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<float>(d2)));
3855}
3856
3857template<class P_numtype1, class P_struct1>
3858inline
3859_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3860    _bz_unordered<P_numtype1,double> > >
3861unordered(const Matrix<P_numtype1, P_struct1>& d1, double d2)
3862{
3863    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<double>,
3864        _bz_unordered<P_numtype1,double> > T_expr;
3865
3866    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<double>(d2)));
3867}
3868
3869template<class P_numtype1, class P_struct1>
3870inline
3871_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3872    _bz_unordered<P_numtype1,long double> > >
3873unordered(const Matrix<P_numtype1, P_struct1>& d1, long double d2)
3874{
3875    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<long double>,
3876        _bz_unordered<P_numtype1,long double> > T_expr;
3877
3878    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<long double>(d2)));
3879}
3880
3881template<class P_numtype1, class P_struct1, class T2>
3882inline
3883_bz_MatExpr<_bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3884    _bz_unordered<P_numtype1,complex<T2> > > >
3885unordered(const Matrix<P_numtype1, P_struct1>& d1, complex<T2> d2)
3886{
3887    typedef _bz_MatExprOp<_bz_MatrixRef<P_numtype1, P_struct1>, _bz_MatExprConstant<complex<T2> > ,
3888        _bz_unordered<P_numtype1,complex<T2> > > T_expr;
3889
3890    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef(), _bz_MatExprConstant<complex<T2> > (d2)));
3891}
3892
3893template<class P_expr1, class P_numtype2, class P_struct2>
3894inline
3895_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3896    _bz_unordered<typename P_expr1::T_numtype,P_numtype2> > >
3897unordered(_bz_MatExpr<P_expr1> d1, const Matrix<P_numtype2, P_struct2>& d2)
3898{
3899    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatrixRef<P_numtype2, P_struct2>,
3900        _bz_unordered<typename P_expr1::T_numtype,P_numtype2> > T_expr;
3901
3902    return _bz_MatExpr<T_expr>(T_expr(d1, d2._bz_getRef()));
3903}
3904
3905template<class P_expr1, class P_expr2>
3906inline
3907_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3908    _bz_unordered<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3909unordered(_bz_MatExpr<P_expr1> d1, _bz_MatExpr<P_expr2> d2)
3910{
3911    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExpr<P_expr2>,
3912        _bz_unordered<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > T_expr;
3913
3914    return _bz_MatExpr<T_expr>(T_expr(d1, d2));
3915}
3916
3917template<class P_expr1>
3918inline
3919_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3920    _bz_unordered<typename P_expr1::T_numtype,int> > >
3921unordered(_bz_MatExpr<P_expr1> d1, int d2)
3922{
3923    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<int>,
3924        _bz_unordered<typename P_expr1::T_numtype,int> > T_expr;
3925
3926    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<int>(d2)));
3927}
3928
3929template<class P_expr1>
3930inline
3931_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3932    _bz_unordered<typename P_expr1::T_numtype,float> > >
3933unordered(_bz_MatExpr<P_expr1> d1, float d2)
3934{
3935    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<float>,
3936        _bz_unordered<typename P_expr1::T_numtype,float> > T_expr;
3937
3938    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<float>(d2)));
3939}
3940
3941template<class P_expr1>
3942inline
3943_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3944    _bz_unordered<typename P_expr1::T_numtype,double> > >
3945unordered(_bz_MatExpr<P_expr1> d1, double d2)
3946{
3947    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<double>,
3948        _bz_unordered<typename P_expr1::T_numtype,double> > T_expr;
3949
3950    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<double>(d2)));
3951}
3952
3953template<class P_expr1>
3954inline
3955_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3956    _bz_unordered<typename P_expr1::T_numtype,long double> > >
3957unordered(_bz_MatExpr<P_expr1> d1, long double d2)
3958{
3959    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<long double>,
3960        _bz_unordered<typename P_expr1::T_numtype,long double> > T_expr;
3961
3962    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<long double>(d2)));
3963}
3964
3965template<class P_expr1, class T2>
3966inline
3967_bz_MatExpr<_bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3968    _bz_unordered<typename P_expr1::T_numtype,complex<T2> > > >
3969unordered(_bz_MatExpr<P_expr1> d1, complex<T2> d2)
3970{
3971    typedef _bz_MatExprOp<_bz_MatExpr<P_expr1>, _bz_MatExprConstant<complex<T2> > ,
3972        _bz_unordered<typename P_expr1::T_numtype,complex<T2> > > T_expr;
3973
3974    return _bz_MatExpr<T_expr>(T_expr(d1, _bz_MatExprConstant<complex<T2> > (d2)));
3975}
3976
3977template<class P_numtype2, class P_struct2>
3978inline
3979_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3980    _bz_unordered<int,P_numtype2> > >
3981unordered(int d1, const Matrix<P_numtype2, P_struct2>& d2)
3982{
3983    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatrixRef<P_numtype2, P_struct2>,
3984        _bz_unordered<int,P_numtype2> > T_expr;
3985
3986    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2._bz_getRef()));
3987}
3988
3989template<class P_expr2>
3990inline
3991_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3992    _bz_unordered<int,typename P_expr2::T_numtype> > >
3993unordered(int d1, _bz_MatExpr<P_expr2> d2)
3994{
3995    typedef _bz_MatExprOp<_bz_MatExprConstant<int>, _bz_MatExpr<P_expr2>,
3996        _bz_unordered<int,typename P_expr2::T_numtype> > T_expr;
3997
3998    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<int>(d1), d2));
3999}
4000
4001template<class P_numtype2, class P_struct2>
4002inline
4003_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
4004    _bz_unordered<float,P_numtype2> > >
4005unordered(float d1, const Matrix<P_numtype2, P_struct2>& d2)
4006{
4007    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatrixRef<P_numtype2, P_struct2>,
4008        _bz_unordered<float,P_numtype2> > T_expr;
4009
4010    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2._bz_getRef()));
4011}
4012
4013template<class P_expr2>
4014inline
4015_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
4016    _bz_unordered<float,typename P_expr2::T_numtype> > >
4017unordered(float d1, _bz_MatExpr<P_expr2> d2)
4018{
4019    typedef _bz_MatExprOp<_bz_MatExprConstant<float>, _bz_MatExpr<P_expr2>,
4020        _bz_unordered<float,typename P_expr2::T_numtype> > T_expr;
4021
4022    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<float>(d1), d2));
4023}
4024
4025template<class P_numtype2, class P_struct2>
4026inline
4027_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
4028    _bz_unordered<double,P_numtype2> > >
4029unordered(double d1, const Matrix<P_numtype2, P_struct2>& d2)
4030{
4031    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatrixRef<P_numtype2, P_struct2>,
4032        _bz_unordered<double,P_numtype2> > T_expr;
4033
4034    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2._bz_getRef()));
4035}
4036
4037template<class P_expr2>
4038inline
4039_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
4040    _bz_unordered<double,typename P_expr2::T_numtype> > >
4041unordered(double d1, _bz_MatExpr<P_expr2> d2)
4042{
4043    typedef _bz_MatExprOp<_bz_MatExprConstant<double>, _bz_MatExpr<P_expr2>,
4044        _bz_unordered<double,typename P_expr2::T_numtype> > T_expr;
4045
4046    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<double>(d1), d2));
4047}
4048
4049template<class P_numtype2, class P_struct2>
4050inline
4051_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
4052    _bz_unordered<long double,P_numtype2> > >
4053unordered(long double d1, const Matrix<P_numtype2, P_struct2>& d2)
4054{
4055    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatrixRef<P_numtype2, P_struct2>,
4056        _bz_unordered<long double,P_numtype2> > T_expr;
4057
4058    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2._bz_getRef()));
4059}
4060
4061template<class P_expr2>
4062inline
4063_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
4064    _bz_unordered<long double,typename P_expr2::T_numtype> > >
4065unordered(long double d1, _bz_MatExpr<P_expr2> d2)
4066{
4067    typedef _bz_MatExprOp<_bz_MatExprConstant<long double>, _bz_MatExpr<P_expr2>,
4068        _bz_unordered<long double,typename P_expr2::T_numtype> > T_expr;
4069
4070    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<long double>(d1), d2));
4071}
4072
4073template<class T1, class P_numtype2, class P_struct2>
4074inline
4075_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
4076    _bz_unordered<complex<T1> ,P_numtype2> > >
4077unordered(complex<T1> d1, const Matrix<P_numtype2, P_struct2>& d2)
4078{
4079    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatrixRef<P_numtype2, P_struct2>,
4080        _bz_unordered<complex<T1> ,P_numtype2> > T_expr;
4081
4082    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2._bz_getRef()));
4083}
4084
4085template<class T1, class P_expr2>
4086inline
4087_bz_MatExpr<_bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
4088    _bz_unordered<complex<T1> ,typename P_expr2::T_numtype> > >
4089unordered(complex<T1> d1, _bz_MatExpr<P_expr2> d2)
4090{
4091    typedef _bz_MatExprOp<_bz_MatExprConstant<complex<T1> > , _bz_MatExpr<P_expr2>,
4092        _bz_unordered<complex<T1> ,typename P_expr2::T_numtype> > T_expr;
4093
4094    return _bz_MatExpr<T_expr>(T_expr(_bz_MatExprConstant<complex<T1> > (d1), d2));
4095}
4096
4097#endif
4098
4099/****************************************************************************
4100 * y0
4101 ****************************************************************************/
4102
4103#ifdef BZ_HAVE_IEEE_MATH
4104template<class P_numtype1, class P_struct1>
4105inline
4106_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
4107    _bz_y0<P_numtype1> > >
4108y0(const Matrix<P_numtype1, P_struct1>& d1)
4109{
4110    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
4111        _bz_y0<P_numtype1> > T_expr;
4112
4113    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
4114}
4115
4116template<class P_expr1>
4117inline
4118_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
4119    _bz_y0<typename P_expr1::T_numtype> > >
4120y0(_bz_MatExpr<P_expr1> d1)
4121{
4122    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
4123        _bz_y0<typename P_expr1::T_numtype> > T_expr;
4124
4125    return _bz_MatExpr<T_expr>(T_expr(d1));
4126}
4127
4128#endif
4129
4130/****************************************************************************
4131 * y1
4132 ****************************************************************************/
4133
4134#ifdef BZ_HAVE_IEEE_MATH
4135template<class P_numtype1, class P_struct1>
4136inline
4137_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
4138    _bz_y1<P_numtype1> > >
4139y1(const Matrix<P_numtype1, P_struct1>& d1)
4140{
4141    typedef _bz_MatExprUnaryOp<_bz_MatrixRef<P_numtype1, P_struct1>,
4142        _bz_y1<P_numtype1> > T_expr;
4143
4144    return _bz_MatExpr<T_expr>(T_expr(d1._bz_getRef()));
4145}
4146
4147template<class P_expr1>
4148inline
4149_bz_MatExpr<_bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
4150    _bz_y1<typename P_expr1::T_numtype> > >
4151y1(_bz_MatExpr<P_expr1> d1)
4152{
4153    typedef _bz_MatExprUnaryOp<_bz_MatExpr<P_expr1>,
4154        _bz_y1<typename P_expr1::T_numtype> > T_expr;
4155
4156    return _bz_MatExpr<T_expr>(T_expr(d1));
4157}
4158
4159#endif
4160
4161
4162BZ_NAMESPACE_END
4163
4164#endif // BZ_MATUOPS_H
Note: See TracBrowser for help on using the repository browser.