Mercurial > forge
comparison main/fixed/src/fixedNDArray.cc @ 5655:0924c374b60d octave-forge
Update fixed point code for 3.1.x. Minor bug in test code still present though code seems to work fine
author | adb014 |
---|---|
date | Mon, 18 May 2009 03:18:11 +0000 |
parents | 2de537641f94 |
children | d84d2fea3c90 |
comparison
equal
deleted
inserted
replaced
5654:8106adc5057c | 5655:0924c374b60d |
---|---|
39 | 39 |
40 #include "fixedMatrix.h" | 40 #include "fixedMatrix.h" |
41 #include "fixedNDArray.h" | 41 #include "fixedNDArray.h" |
42 #include "fixedCNDArray.h" | 42 #include "fixedCNDArray.h" |
43 | 43 |
44 #include "fixed-inline.cc" | |
45 | |
44 // Fixed Point NDArray class. | 46 // Fixed Point NDArray class. |
45 | 47 |
46 FixedNDArray::FixedNDArray (const MArrayN<int> &is, const MArrayN<int> &ds) | 48 FixedNDArray::FixedNDArray (const MArrayN<int> &is, const MArrayN<int> &ds) |
47 : MArrayN<FixedPoint> (is.dims()) | 49 : MArrayN<FixedPoint> (is.dims()) |
48 { | 50 { |
355 // other operations. | 357 // other operations. |
356 | 358 |
357 boolNDArray | 359 boolNDArray |
358 FixedNDArray::all (octave_idx_type dim) const | 360 FixedNDArray::all (octave_idx_type dim) const |
359 { | 361 { |
360 #define FMX_ND_ALL_EXPR elem (iter_idx) .fixedpoint () == 0.0 | 362 return do_mx_red_op<boolNDArray> (*this, dim, mx_inline_all); |
361 MX_ND_ANY_ALL_REDUCTION (MX_ND_ALL_EVAL (FMX_ND_ALL_EXPR), true); | |
362 #undef FMX_ND_ALL_EXPR | |
363 } | 363 } |
364 | 364 |
365 boolNDArray | 365 boolNDArray |
366 FixedNDArray::any (octave_idx_type dim) const | 366 FixedNDArray::any (octave_idx_type dim) const |
367 { | 367 { |
368 #define FMX_ND_ANY_EXPR elem (iter_idx) .fixedpoint () != 0.0 | 368 return do_mx_red_op<boolNDArray> (*this, dim, mx_inline_any); |
369 MX_ND_ANY_ALL_REDUCTION (MX_ND_ANY_EVAL (FMX_ND_ANY_EXPR), false); | |
370 #undef FMX_ND_ANY_EXPR | |
371 } | 369 } |
372 | 370 |
373 FixedNDArray | 371 FixedNDArray |
374 FixedNDArray::cumprod (octave_idx_type dim) const | 372 FixedNDArray::cumprod (octave_idx_type dim) const |
375 { | 373 { |
376 FixedPoint one(1,0,1,0); | 374 return do_mx_cum_op<FixedNDArray> (*this, dim, mx_inline_cumprod); |
377 MX_ND_CUMULATIVE_OP (FixedNDArray, FixedPoint, one, *); | |
378 } | 375 } |
379 | 376 |
380 FixedNDArray | 377 FixedNDArray |
381 FixedNDArray::cumsum (octave_idx_type dim) const | 378 FixedNDArray::cumsum (octave_idx_type dim) const |
382 { | 379 { |
383 FixedPoint zero; | 380 return do_mx_cum_op<FixedNDArray> (*this, dim, mx_inline_cumsum); |
384 MX_ND_CUMULATIVE_OP (FixedNDArray, FixedPoint, zero, +); | |
385 } | 381 } |
386 | 382 |
387 FixedNDArray | 383 FixedNDArray |
388 FixedNDArray::prod (octave_idx_type dim) const | 384 FixedNDArray::prod (octave_idx_type dim) const |
389 { | 385 { |
390 FixedPoint one(1,0,1,0); | 386 return do_mx_red_op<FixedNDArray> (*this, dim, mx_inline_prod); |
391 MX_ND_REDUCTION (retval(result_idx) *= elem (iter_idx), one, FixedNDArray); | |
392 } | 387 } |
393 | 388 |
394 FixedNDArray | 389 FixedNDArray |
395 FixedNDArray::sum (octave_idx_type dim) const | 390 FixedNDArray::sum (octave_idx_type dim) const |
396 { | 391 { |
397 FixedPoint zero; | 392 return do_mx_red_op<FixedNDArray> (*this, dim, mx_inline_sum); |
398 MX_ND_REDUCTION (retval(result_idx) += elem (iter_idx), zero, FixedNDArray); | |
399 } | 393 } |
400 | 394 |
401 FixedNDArray | 395 FixedNDArray |
402 FixedNDArray::sumsq (octave_idx_type dim) const | 396 FixedNDArray::sumsq (octave_idx_type dim) const |
403 { | 397 { |
404 FixedPoint zero; | 398 return do_mx_red_op<FixedNDArray> (*this, dim, mx_inline_sumsq); |
405 MX_ND_REDUCTION (retval(result_idx) += pow (elem (iter_idx), 2), zero, | |
406 FixedNDArray); | |
407 } | 399 } |
408 | 400 |
409 FixedNDArray | 401 FixedNDArray |
410 FixedNDArray::max (octave_idx_type dim) const | 402 FixedNDArray::max (octave_idx_type dim) const |
411 { | 403 { |
412 ArrayN<octave_idx_type> dummy_idx; | 404 return do_mx_minmax_op<FixedNDArray> (*this, dim, mx_inline_max); |
413 return max (dummy_idx, dim); | |
414 } | 405 } |
415 | 406 |
416 FixedNDArray | 407 FixedNDArray |
417 FixedNDArray::max (ArrayN<octave_idx_type>& idx_arg, octave_idx_type dim) const | 408 FixedNDArray::max (ArrayN<octave_idx_type>& idx_arg, octave_idx_type dim) const |
418 { | 409 { |
419 dim_vector dv = dims (); | 410 return do_mx_minmax_op<FixedNDArray> (*this, idx_arg, dim, mx_inline_max); |
420 dim_vector dr = dims (); | |
421 | |
422 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
423 return FixedNDArray (); | |
424 | |
425 dr(dim) = 1; | |
426 | |
427 FixedNDArray result (dr); | |
428 idx_arg.resize (dr); | |
429 | |
430 octave_idx_type x_stride = 1; | |
431 octave_idx_type x_len = dv(dim); | |
432 for (octave_idx_type i = 0; i < dim; i++) | |
433 x_stride *= dv(i); | |
434 | |
435 for (octave_idx_type i = 0; i < dr.numel (); i++) | |
436 { | |
437 octave_idx_type x_offset; | |
438 if (x_stride == 1) | |
439 x_offset = i * x_len; | |
440 else | |
441 { | |
442 octave_idx_type x_offset2 = 0; | |
443 x_offset = i; | |
444 while (x_offset >= x_stride) | |
445 { | |
446 x_offset -= x_stride; | |
447 x_offset2++; | |
448 } | |
449 x_offset += x_offset2 * x_stride * x_len; | |
450 } | |
451 | |
452 octave_idx_type idx_j = 0; | |
453 FixedPoint tmp_max = elem (x_offset);; | |
454 | |
455 for (octave_idx_type j = 1; j < x_len; j++) | |
456 { | |
457 FixedPoint tmp = elem (j * x_stride + x_offset); | |
458 | |
459 if (tmp > tmp_max) | |
460 { | |
461 idx_j = j; | |
462 tmp_max = tmp; | |
463 } | |
464 } | |
465 | |
466 result.elem (i) = tmp_max; | |
467 idx_arg.elem (i) = idx_j; | |
468 } | |
469 | |
470 return result; | |
471 } | 411 } |
472 | 412 |
473 FixedNDArray | 413 FixedNDArray |
474 FixedNDArray::min (octave_idx_type dim) const | 414 FixedNDArray::min (octave_idx_type dim) const |
475 { | 415 { |
476 ArrayN<octave_idx_type> dummy_idx; | 416 return do_mx_minmax_op<FixedNDArray> (*this, dim, mx_inline_min); |
477 return min (dummy_idx, dim); | |
478 } | 417 } |
479 | 418 |
480 FixedNDArray | 419 FixedNDArray |
481 FixedNDArray::min (ArrayN<octave_idx_type>& idx_arg, octave_idx_type dim) const | 420 FixedNDArray::min (ArrayN<octave_idx_type>& idx_arg, octave_idx_type dim) const |
482 { | 421 { |
483 dim_vector dv = dims (); | 422 return do_mx_minmax_op<FixedNDArray> (*this, idx_arg, dim, mx_inline_min); |
484 dim_vector dr = dims (); | |
485 | |
486 if (dv.numel () == 0 || dim > dv.length () || dim < 0) | |
487 return FixedNDArray (); | |
488 | |
489 dr(dim) = 1; | |
490 | |
491 FixedNDArray result (dr); | |
492 idx_arg.resize (dr); | |
493 | |
494 octave_idx_type x_stride = 1; | |
495 octave_idx_type x_len = dv(dim); | |
496 for (octave_idx_type i = 0; i < dim; i++) | |
497 x_stride *= dv(i); | |
498 | |
499 for (octave_idx_type i = 0; i < dr.numel (); i++) | |
500 { | |
501 octave_idx_type x_offset; | |
502 if (x_stride == 1) | |
503 x_offset = i * x_len; | |
504 else | |
505 { | |
506 octave_idx_type x_offset2 = 0; | |
507 x_offset = i; | |
508 while (x_offset >= x_stride) | |
509 { | |
510 x_offset -= x_stride; | |
511 x_offset2++; | |
512 } | |
513 x_offset += x_offset2 * x_stride * x_len; | |
514 } | |
515 | |
516 octave_idx_type idx_j = 0; | |
517 FixedPoint tmp_min = elem (x_offset); | |
518 | |
519 for (octave_idx_type j = 1; j < x_len; j++) | |
520 { | |
521 FixedPoint tmp = elem (j * x_stride + x_offset); | |
522 | |
523 if (tmp < tmp_min) | |
524 { | |
525 idx_j = j; | |
526 tmp_min = tmp; | |
527 } | |
528 } | |
529 | |
530 result.elem (i) = tmp_min; | |
531 idx_arg.elem (i) = idx_j; | |
532 } | |
533 | |
534 return result; | |
535 } | 423 } |
536 | 424 |
537 FixedNDArray | 425 FixedNDArray |
538 FixedNDArray::abs (void) const | 426 FixedNDArray::abs (void) const |
539 { | 427 { |