Mercurial > octave-nkf
diff src/data.cc @ 4946:48a39e2b2ab7
[project @ 2004-08-31 17:27:04 by jwe]
author | jwe |
---|---|
date | Tue, 31 Aug 2004 17:27:05 +0000 |
parents | 4bd917f8a4a7 |
children | b2bf2a130eba |
line wrap: on
line diff
--- a/src/data.cc Tue Aug 31 15:09:17 2004 +0000 +++ b/src/data.cc Tue Aug 31 17:27:05 2004 +0000 @@ -1208,31 +1208,24 @@ int nargin = args.length (); - std::string nm = "double"; - - int ndim = 0; + oct_data_conv::data_type dt = oct_data_conv::dt_double; - dim_vector dims; + dim_vector dims (1, 1); - // Check for type information. - if (nargin > 0 && args(nargin-1).is_string ()) { - nm = args(nargin-1).string_value(); + std::string nm = args(nargin-1).string_value (); nargin--; - if (nm != "int8" && nm != "int16" && nm != "int32" && nm != "int64" && - nm != "uint8" && nm != "uint16" && nm != "uint32" && nm != "uint64" - && nm != "double") - error ("%s: Unrecognized or illegal classname", fcn); + dt = oct_data_conv::string_to_data_type (nm); + + if (error_state) + return retval; } - // determine matrix dimension - switch (nargin) { case 0: - ndim = 0; break; case 1: @@ -1259,78 +1252,62 @@ if (! error_state) { - ndim = dims.length (); - - for (int i = ndim-1; i > 1; i--) - { - if (dims(i) == 1) - ndim--; - else - break; - } - - dims.resize (ndim); + dims.chop_trailing_singletons (); check_dimensions (dims, fcn); + // XXX FIXME XXX -- perhaps this should be made extensible by + // using the class name to lookup a function to call to create + // the new value. + + // Note that automatic narrowing will handle conversion from + // NDArray to scalar. + if (! error_state) { + switch (dt) + { + case oct_data_conv::dt_int8: + retval = int8NDArray (dims, val); + break; -#define INT_FILL_MATRIX(TYPE) \ - { \ - switch (ndim) \ - { \ - case 0: \ - retval = octave_ ## TYPE (val); \ - break; \ - \ - default: \ - retval = TYPE ## NDArray (dims, val); \ - break; \ - } \ - } + case oct_data_conv::dt_uint8: + retval = uint8NDArray (dims, val); + break; + + case oct_data_conv::dt_int16: + retval = int16NDArray (dims, val); + break; + + case oct_data_conv::dt_uint16: + retval = uint16NDArray (dims, val); + break; + + case oct_data_conv::dt_int32: + retval = int32NDArray (dims, val); + break; - if (nm == "int8") - INT_FILL_MATRIX (int8) - else if (nm == "int16") - INT_FILL_MATRIX (int16) - else if (nm == "int32") - INT_FILL_MATRIX (int32) - else if (nm == "int64") - INT_FILL_MATRIX (int64) - else if (nm == "uint8") - INT_FILL_MATRIX (uint8) - else if (nm == "uint16") - INT_FILL_MATRIX (uint16) - else if (nm == "uint32") - INT_FILL_MATRIX (uint32) - else if (nm == "uint64") - INT_FILL_MATRIX (uint64) - else - { - // Construct either scalar, matrix or N-d array. - switch (ndim) - { - case 0: - retval = val; - break; + case oct_data_conv::dt_uint32: + retval = uint32NDArray (dims, val); + break; + + case oct_data_conv::dt_int64: + retval = int64NDArray (dims, val); + break; - case 1: - retval = Matrix (dims(0), dims(0), val); - break; - - case 2: - retval = Matrix (dims(0), dims(1), val); - break; + case oct_data_conv::dt_uint64: + retval = uint64NDArray (dims, val); + break; - default: - retval = NDArray (dims, val); - break; - } + case oct_data_conv::dt_single: // XXX FIXME XXX + case oct_data_conv::dt_double: + retval = NDArray (dims, val); + break; + + default: + error ("%s: invalid class name", fcn); + break; } - -#undef INT_FILL_MATRIX - } } @@ -1384,72 +1361,101 @@ return fill_matrix (args, 0.0, "zeros"); } +template <class MT> +octave_value +identity_matrix (int nr, int nc) +{ + octave_value retval; + + typename octave_array_type_traits<MT>::element_type one (1); + + if (nr == 1 && nc == 1) + retval = one; + else + { + dim_vector dims (nr, nc); + + typename octave_array_type_traits<MT>::element_type zero (0); + + MT m (dims, zero); + + if (nr > 0 && nc > 0) + { + int n = std::min (nr, nc); + + for (int i = 0; i < n; i++) + m(i,i) = one; + } + + retval = m; + } + + return retval; +} + static octave_value identity_matrix (int nr, int nc, const std::string& nm) { octave_value retval; -#define INT_EYE_MATRIX(TYPE) \ - { \ - if (nr == 1 && nc == 1) \ - retval = octave_ ## TYPE (1); \ - else \ - { \ - dim_vector dims (nr, nc); \ - TYPE ## NDArray m (dims, octave_ ## TYPE (0));\ - if (nr > 0 && nc > 0) \ - { \ - int n = std::min (nr, nc); \ - \ - for (int i = 0; i < n; i++) \ - m (i, i) = octave_ ## TYPE (1); \ - } \ - retval = m; \ - } \ - } + oct_data_conv::data_type dt = oct_data_conv::string_to_data_type (nm); + + // XXX FIXME XXX -- perhaps this should be made extensible by using + // the class name to lookup a function to call to create the new + // value. + + if (! error_state) + { + switch (dt) + { + case oct_data_conv::dt_int8: + retval = identity_matrix<int8NDArray> (nr, nc); + break; + + case oct_data_conv::dt_uint8: + retval = identity_matrix<uint8NDArray> (nr, nc); + break; + + case oct_data_conv::dt_int16: + retval = identity_matrix<int16NDArray> (nr, nc); + break; - if (nm == "int8") - INT_EYE_MATRIX (int8) - else if (nm == "int16") - INT_EYE_MATRIX (int16) - else if (nm == "int32") - INT_EYE_MATRIX (int32) - else if (nm == "int64") - INT_EYE_MATRIX (int64) - else if (nm == "uint8") - INT_EYE_MATRIX (uint8) - else if (nm == "uint16") - INT_EYE_MATRIX (uint16) - else if (nm == "uint32") - INT_EYE_MATRIX (uint32) - else if (nm == "uint64") - INT_EYE_MATRIX (uint64) - else - { - if (nr == 1 && nc == 1) - retval = 1.0; - else - { + case oct_data_conv::dt_uint16: + retval = identity_matrix<uint16NDArray> (nr, nc); + break; + + case oct_data_conv::dt_int32: + retval = identity_matrix<int32NDArray> (nr, nc); + break; + + case oct_data_conv::dt_uint32: + retval = identity_matrix<uint32NDArray> (nr, nc); + break; - Matrix m (nr, nc, 0.0); - - if (nr > 0 && nc > 0) - { - int n = std::min (nr, nc); + case oct_data_conv::dt_int64: + retval = identity_matrix<int64NDArray> (nr, nc); + break; + + case oct_data_conv::dt_uint64: + retval = identity_matrix<uint64NDArray> (nr, nc); + break; - for (int i = 0; i < n; i++) - m (i, i) = 1.0; - } + case oct_data_conv::dt_single: // XXX FIXME XXX + case oct_data_conv::dt_double: + retval = identity_matrix<NDArray> (nr, nc); + break; - retval = m; + default: + error ("eye: invalid class name"); + break; } } -#undef INT_EYE_MATRIX - return retval; } +#undef INT_EYE_MATRIX + DEFUN (eye, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {} eye (@var{x})\n\