Mercurial > hg > octave-nkf
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: |