comparison liboctave/dNDArray.cc @ 10143:f3c34b518422

simplify pairwise min/max implementations
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 20 Jan 2010 10:58:55 +0100
parents 829e69ec3110
children 4c0cdbe0acca
comparison
equal deleted inserted replaced
10142:829e69ec3110 10143:f3c34b518422
979 done: 979 done:
980 980
981 return is; 981 return is;
982 } 982 }
983 983
984 // FIXME -- it would be nice to share code among the min/max 984 NDArray
985 // functions below. 985 min (double s, const NDArray& m)
986 986 {
987 #define EMPTY_RETURN_CHECK(T) \ 987 return do_sm_binary_op<NDArray> (s, m, mx_inline_xmin);
988 if (nel == 0) \ 988 }
989 return T (dv); 989
990 990 NDArray
991 NDArray 991 min (const NDArray& m, double s)
992 min (double d, const NDArray& m) 992 {
993 { 993 return do_ms_binary_op<NDArray> (m, s, mx_inline_xmin);
994 dim_vector dv = m.dims ();
995 octave_idx_type nel = dv.numel ();
996
997 EMPTY_RETURN_CHECK (NDArray);
998
999 NDArray result (dv);
1000
1001 for (octave_idx_type i = 0; i < nel; i++)
1002 {
1003 octave_quit ();
1004 result (i) = xmin (d, m (i));
1005 }
1006
1007 return result;
1008 }
1009
1010 NDArray
1011 min (const NDArray& m, double d)
1012 {
1013 dim_vector dv = m.dims ();
1014 octave_idx_type nel = dv.numel ();
1015
1016 EMPTY_RETURN_CHECK (NDArray);
1017
1018 NDArray result (dv);
1019
1020 for (octave_idx_type i = 0; i < nel; i++)
1021 {
1022 octave_quit ();
1023 result (i) = xmin (d, m (i));
1024 }
1025
1026 return result;
1027 } 994 }
1028 995
1029 NDArray 996 NDArray
1030 min (const NDArray& a, const NDArray& b) 997 min (const NDArray& a, const NDArray& b)
1031 { 998 {
1032 dim_vector dv = a.dims (); 999 return do_mm_binary_op<NDArray> (a, b, mx_inline_xmin, "min");
1033 octave_idx_type nel = dv.numel (); 1000 }
1034 1001
1035 if (dv != b.dims ()) 1002 NDArray
1036 { 1003 max (double s, const NDArray& m)
1037 (*current_liboctave_error_handler) 1004 {
1038 ("two-arg min expecting args of same size"); 1005 return do_sm_binary_op<NDArray> (s, m, mx_inline_xmax);
1039 return NDArray (); 1006 }
1040 } 1007
1041 1008 NDArray
1042 EMPTY_RETURN_CHECK (NDArray); 1009 max (const NDArray& m, double s)
1043 1010 {
1044 NDArray result (dv); 1011 return do_ms_binary_op<NDArray> (m, s, mx_inline_xmax);
1045
1046 for (octave_idx_type i = 0; i < nel; i++)
1047 {
1048 octave_quit ();
1049 result (i) = xmin (a (i), b (i));
1050 }
1051
1052 return result;
1053 }
1054
1055 NDArray
1056 max (double d, const NDArray& m)
1057 {
1058 dim_vector dv = m.dims ();
1059 octave_idx_type nel = dv.numel ();
1060
1061 EMPTY_RETURN_CHECK (NDArray);
1062
1063 NDArray result (dv);
1064
1065 for (octave_idx_type i = 0; i < nel; i++)
1066 {
1067 octave_quit ();
1068 result (i) = xmax (d, m (i));
1069 }
1070
1071 return result;
1072 }
1073
1074 NDArray
1075 max (const NDArray& m, double d)
1076 {
1077 dim_vector dv = m.dims ();
1078 octave_idx_type nel = dv.numel ();
1079
1080 EMPTY_RETURN_CHECK (NDArray);
1081
1082 NDArray result (dv);
1083
1084 for (octave_idx_type i = 0; i < nel; i++)
1085 {
1086 octave_quit ();
1087 result (i) = xmax (d, m (i));
1088 }
1089
1090 return result;
1091 } 1012 }
1092 1013
1093 NDArray 1014 NDArray
1094 max (const NDArray& a, const NDArray& b) 1015 max (const NDArray& a, const NDArray& b)
1095 { 1016 {
1096 dim_vector dv = a.dims (); 1017 return do_mm_binary_op<NDArray> (a, b, mx_inline_xmax, "max");
1097 octave_idx_type nel = dv.numel ();
1098
1099 if (dv != b.dims ())
1100 {
1101 (*current_liboctave_error_handler)
1102 ("two-arg max expecting args of same size");
1103 return NDArray ();
1104 }
1105
1106 EMPTY_RETURN_CHECK (NDArray);
1107
1108 NDArray result (dv);
1109
1110 for (octave_idx_type i = 0; i < nel; i++)
1111 {
1112 octave_quit ();
1113 result (i) = xmax (a (i), b (i));
1114 }
1115
1116 return result;
1117 } 1018 }
1118 1019
1119 NDS_CMP_OPS (NDArray, double) 1020 NDS_CMP_OPS (NDArray, double)
1120 NDS_BOOL_OPS (NDArray, double) 1021 NDS_BOOL_OPS (NDArray, double)
1121 1022