Mercurial > octave-nkf
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; |