comparison src/xpow.cc @ 8978:0a58c4cd1405

optimize element-wise power
author Jaroslav Hajek <highegg@gmail.com>
date Fri, 13 Mar 2009 22:33:26 +0100
parents 93f18f166aba
children a7c00773a089
comparison
equal deleted inserted replaced
8977:f464119ec165 8978:0a58c4cd1405
77 octave_value 77 octave_value
78 xpow (double a, double b) 78 xpow (double a, double b)
79 { 79 {
80 double retval; 80 double retval;
81 81
82 if (a < 0.0 && static_cast<int> (b) != b) 82 if (a < 0.0 && ! xisint (b))
83 { 83 {
84 Complex atmp (a); 84 Complex atmp (a);
85 85
86 return std::pow (atmp, b); 86 return std::pow (atmp, b);
87 } 87 }
698 octave_value retval; 698 octave_value retval;
699 699
700 octave_idx_type nr = a.rows (); 700 octave_idx_type nr = a.rows ();
701 octave_idx_type nc = a.cols (); 701 octave_idx_type nc = a.cols ();
702 702
703 if (static_cast<int> (b) != b && a.any_element_is_negative ()) 703 if (! xisint (b) && a.any_element_is_negative ())
704 { 704 {
705 ComplexMatrix result (nr, nc); 705 ComplexMatrix result (nr, nc);
706 706
707 for (octave_idx_type j = 0; j < nc; j++) 707 for (octave_idx_type j = 0; j < nc; j++)
708 for (octave_idx_type i = 0; i < nr; i++) 708 for (octave_idx_type i = 0; i < nr; i++)
1082 octave_value 1082 octave_value
1083 elem_xpow (const NDArray& a, double b) 1083 elem_xpow (const NDArray& a, double b)
1084 { 1084 {
1085 octave_value retval; 1085 octave_value retval;
1086 1086
1087 if (static_cast<int> (b) != b && a.any_element_is_negative ()) 1087 if (! xisint (b))
1088 { 1088 {
1089 ComplexNDArray result (a.dims ()); 1089 if (a.any_element_is_negative ())
1090 1090 {
1091 for (octave_idx_type i = 0; i < a.length (); i++) 1091 ComplexNDArray result (a.dims ());
1092 { 1092
1093 OCTAVE_QUIT; 1093 for (octave_idx_type i = 0; i < a.length (); i++)
1094 1094 {
1095 Complex atmp (a (i)); 1095 OCTAVE_QUIT;
1096 1096
1097 result(i) = std::pow (atmp, b); 1097 Complex atmp (a (i));
1098 } 1098
1099 1099 result(i) = std::pow (atmp, b);
1100 retval = result; 1100 }
1101
1102 retval = result;
1103 }
1104 else
1105 {
1106 NDArray result (a.dims ());
1107 for (octave_idx_type i = 0; i < a.length (); i++)
1108 {
1109 OCTAVE_QUIT;
1110 result(i) = std::pow (a(i), b);
1111 }
1112
1113 retval = result;
1114 }
1101 } 1115 }
1102 else 1116 else
1103 { 1117 {
1104 NDArray result (a.dims ()); 1118 NDArray result (a.dims ());
1105 1119
1106 for (octave_idx_type i = 0; i < a.length (); i++) 1120 int ib = static_cast<int> (b);
1107 { 1121 if (ib == 2)
1108 OCTAVE_QUIT; 1122 {
1109 result(i) = std::pow (a(i), b); 1123 for (octave_idx_type i = 0; i < a.length (); i++)
1110 } 1124 result.xelem (i) = a(i) * a(i);
1125 }
1126 else
1127 {
1128 for (octave_idx_type i = 0; i < a.length (); i++)
1129 {
1130 OCTAVE_QUIT;
1131 result(i) = std::pow (a(i), ib);
1132 }
1133 }
1111 1134
1112 retval = result; 1135 retval = result;
1113 } 1136 }
1114 1137
1115 return retval; 1138 return retval;
1369 octave_value 1392 octave_value
1370 xpow (float a, float b) 1393 xpow (float a, float b)
1371 { 1394 {
1372 float retval; 1395 float retval;
1373 1396
1374 if (a < 0.0 && static_cast<int> (b) != b) 1397 if (a < 0.0 && ! xisint (b))
1375 { 1398 {
1376 FloatComplex atmp (a); 1399 FloatComplex atmp (a);
1377 1400
1378 return std::pow (atmp, b); 1401 return std::pow (atmp, b);
1379 } 1402 }
1977 octave_value retval; 2000 octave_value retval;
1978 2001
1979 octave_idx_type nr = a.rows (); 2002 octave_idx_type nr = a.rows ();
1980 octave_idx_type nc = a.cols (); 2003 octave_idx_type nc = a.cols ();
1981 2004
1982 if (static_cast<int> (b) != b && a.any_element_is_negative ()) 2005 if (! xisint (b) && a.any_element_is_negative ())
1983 { 2006 {
1984 FloatComplexMatrix result (nr, nc); 2007 FloatComplexMatrix result (nr, nc);
1985 2008
1986 for (octave_idx_type j = 0; j < nc; j++) 2009 for (octave_idx_type j = 0; j < nc; j++)
1987 for (octave_idx_type i = 0; i < nr; i++) 2010 for (octave_idx_type i = 0; i < nr; i++)
2361 octave_value 2384 octave_value
2362 elem_xpow (const FloatNDArray& a, float b) 2385 elem_xpow (const FloatNDArray& a, float b)
2363 { 2386 {
2364 octave_value retval; 2387 octave_value retval;
2365 2388
2366 if (static_cast<int> (b) != b && a.any_element_is_negative ()) 2389 if (! xisint (b))
2367 { 2390 {
2368 FloatComplexNDArray result (a.dims ()); 2391 if (a.any_element_is_negative ())
2369 2392 {
2370 for (octave_idx_type i = 0; i < a.length (); i++) 2393 FloatComplexNDArray result (a.dims ());
2371 { 2394
2372 OCTAVE_QUIT; 2395 for (octave_idx_type i = 0; i < a.length (); i++)
2373 2396 {
2374 FloatComplex atmp (a (i)); 2397 OCTAVE_QUIT;
2375 2398
2376 result(i) = std::pow (atmp, b); 2399 FloatComplex atmp (a (i));
2377 } 2400
2378 2401 result(i) = std::pow (atmp, b);
2379 retval = result; 2402 }
2403
2404 retval = result;
2405 }
2406 else
2407 {
2408 FloatNDArray result (a.dims ());
2409 for (octave_idx_type i = 0; i < a.length (); i++)
2410 {
2411 OCTAVE_QUIT;
2412 result(i) = std::pow (a(i), b);
2413 }
2414
2415 retval = result;
2416 }
2380 } 2417 }
2381 else 2418 else
2382 { 2419 {
2383 FloatNDArray result (a.dims ()); 2420 FloatNDArray result (a.dims ());
2384 2421
2385 for (octave_idx_type i = 0; i < a.length (); i++) 2422 int ib = static_cast<int> (b);
2386 { 2423 if (ib == 2)
2387 OCTAVE_QUIT; 2424 {
2388 result(i) = std::pow (a(i), b); 2425 for (octave_idx_type i = 0; i < a.length (); i++)
2389 } 2426 result.xelem (i) = a(i) * a(i);
2427 }
2428 else
2429 {
2430 for (octave_idx_type i = 0; i < a.length (); i++)
2431 {
2432 OCTAVE_QUIT;
2433 result(i) = std::pow (a(i), ib);
2434 }
2435 }
2390 2436
2391 retval = result; 2437 retval = result;
2392 } 2438 }
2393 2439
2394 return retval; 2440 return retval;