comparison src/ov-re-mat.cc @ 9823:9b62f2d8de6d

improve r->c mapper strategy
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 17 Nov 2009 11:22:36 +0100
parents 8fa32b527d9a
children 6631c61a4a4e
comparison
equal deleted inserted replaced
9822:64270d3ad469 9823:9b62f2d8de6d
706 pr[i] = p[i]; 706 pr[i] = p[i];
707 707
708 return retval; 708 return retval;
709 } 709 }
710 710
711 // This uses a smarter strategy for doing the complex->real mappers. We
712 // allocate an array for a real result and keep filling it until a complex
713 // result is produced.
714 static octave_value
715 do_rc_map (const NDArray& a, Complex (&fcn) (double))
716 {
717 octave_idx_type n = a.numel ();
718 NoAlias<NDArray> rr (a.dims ());
719
720 for (octave_idx_type i = 0; i < n; i++)
721 {
722 OCTAVE_QUIT;
723
724 Complex tmp = fcn (a(i));
725 if (tmp.imag () == 0.0)
726 rr(i) = tmp.real ();
727 else
728 {
729 NoAlias<ComplexNDArray> rc (a.dims ());
730
731 for (octave_idx_type j = 0; j < i; j++)
732 rc(j) = rr(j);
733
734 rc(i) = tmp;
735
736 for (octave_idx_type j = i+1; j < n; j++)
737 {
738 OCTAVE_QUIT;
739
740 rc(j) = fcn (a(i));
741 }
742
743 return new octave_complex_matrix (rc);
744 }
745 }
746
747 return rr;
748 }
749
711 octave_value 750 octave_value
712 octave_matrix::map (unary_mapper_t umap) const 751 octave_matrix::map (unary_mapper_t umap) const
713 { 752 {
714 switch (umap) 753 switch (umap)
715 { 754 {
732 771
733 #define ARRAY_MAPPER(UMAP, TYPE, FCN) \ 772 #define ARRAY_MAPPER(UMAP, TYPE, FCN) \
734 case umap_ ## UMAP: \ 773 case umap_ ## UMAP: \
735 return octave_value (matrix.map<TYPE> (FCN)) 774 return octave_value (matrix.map<TYPE> (FCN))
736 775
737 ARRAY_MAPPER (acos, Complex, rc_acos); 776 #define RC_ARRAY_MAPPER(UMAP, TYPE, FCN) \
738 ARRAY_MAPPER (acosh, Complex, rc_acosh); 777 case umap_ ## UMAP: \
778 return do_rc_map (matrix, FCN)
779
780 RC_ARRAY_MAPPER (acos, Complex, rc_acos);
781 RC_ARRAY_MAPPER (acosh, Complex, rc_acosh);
739 ARRAY_MAPPER (angle, double, ::arg); 782 ARRAY_MAPPER (angle, double, ::arg);
740 ARRAY_MAPPER (arg, double, ::arg); 783 ARRAY_MAPPER (arg, double, ::arg);
741 ARRAY_MAPPER (asin, Complex, rc_asin); 784 RC_ARRAY_MAPPER (asin, Complex, rc_asin);
742 ARRAY_MAPPER (asinh, double, ::asinh); 785 ARRAY_MAPPER (asinh, double, ::asinh);
743 ARRAY_MAPPER (atan, double, ::atan); 786 ARRAY_MAPPER (atan, double, ::atan);
744 ARRAY_MAPPER (atanh, Complex, rc_atanh); 787 RC_ARRAY_MAPPER (atanh, Complex, rc_atanh);
745 ARRAY_MAPPER (erf, double, ::erf); 788 ARRAY_MAPPER (erf, double, ::erf);
746 ARRAY_MAPPER (erfc, double, ::erfc); 789 ARRAY_MAPPER (erfc, double, ::erfc);
747 ARRAY_MAPPER (gamma, double, xgamma); 790 ARRAY_MAPPER (gamma, double, xgamma);
748 ARRAY_MAPPER (lgamma, Complex, rc_lgamma); 791 RC_ARRAY_MAPPER (lgamma, Complex, rc_lgamma);
749 ARRAY_MAPPER (ceil, double, ::ceil); 792 ARRAY_MAPPER (ceil, double, ::ceil);
750 ARRAY_MAPPER (cos, double, ::cos); 793 ARRAY_MAPPER (cos, double, ::cos);
751 ARRAY_MAPPER (cosh, double, ::cosh); 794 ARRAY_MAPPER (cosh, double, ::cosh);
752 ARRAY_MAPPER (exp, double, ::exp); 795 ARRAY_MAPPER (exp, double, ::exp);
753 ARRAY_MAPPER (expm1, double, ::expm1); 796 ARRAY_MAPPER (expm1, double, ::expm1);
754 ARRAY_MAPPER (fix, double, ::fix); 797 ARRAY_MAPPER (fix, double, ::fix);
755 ARRAY_MAPPER (floor, double, ::floor); 798 ARRAY_MAPPER (floor, double, ::floor);
756 ARRAY_MAPPER (log, Complex, rc_log); 799 RC_ARRAY_MAPPER (log, Complex, rc_log);
757 ARRAY_MAPPER (log2, Complex, rc_log2); 800 RC_ARRAY_MAPPER (log2, Complex, rc_log2);
758 ARRAY_MAPPER (log10, Complex, rc_log10); 801 RC_ARRAY_MAPPER (log10, Complex, rc_log10);
759 ARRAY_MAPPER (log1p, Complex, rc_log1p); 802 RC_ARRAY_MAPPER (log1p, Complex, rc_log1p);
760 ARRAY_MAPPER (round, double, xround); 803 ARRAY_MAPPER (round, double, xround);
761 ARRAY_MAPPER (roundb, double, xroundb); 804 ARRAY_MAPPER (roundb, double, xroundb);
762 ARRAY_MAPPER (signum, double, ::signum); 805 ARRAY_MAPPER (signum, double, ::signum);
763 ARRAY_MAPPER (sin, double, ::sin); 806 ARRAY_MAPPER (sin, double, ::sin);
764 ARRAY_MAPPER (sinh, double, ::sinh); 807 ARRAY_MAPPER (sinh, double, ::sinh);
765 ARRAY_MAPPER (sqrt, Complex, rc_sqrt); 808 RC_ARRAY_MAPPER (sqrt, Complex, rc_sqrt);
766 ARRAY_MAPPER (tan, double, ::tan); 809 ARRAY_MAPPER (tan, double, ::tan);
767 ARRAY_MAPPER (tanh, double, ::tanh); 810 ARRAY_MAPPER (tanh, double, ::tanh);
768 ARRAY_MAPPER (isna, bool, octave_is_NA); 811 ARRAY_MAPPER (isna, bool, octave_is_NA);
769 812
770 default: 813 default: