# HG changeset patch # User Jaroslav Hajek # Date 1211803315 -7200 # Node ID 936478aed051aafca8914e36afb89acf004d3807 # Parent edc25a3fb2bce80302402d876e660de57e332c43 simplify & cleanup octave_value::XXX_vector_value functions diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,17 @@ +2008-05-26 Jaroslav Hajek + + * ov.cc (make_vector_dims): New function. + (vector_value, complex_vector_value, float_vector_value, + float_complex_vector_value): Query N-d array values and simplify, + avoid copying. + (column_vector_value, complex_column_vector_value, + float_column_vector_value, float_complex_column_vector_value, + row_vector_value, complex_row_vector_value, + float_row_vector_value, float_complex_row_vector_value): + Simplify to trivial wrappers. + (int_vector_value): Avoid conversions if integer type, query N-d array + value, simplify. + 2008-05-21 David Bateman * DLD-FUNCTIONS/quad.cc (quad_float_user_function): New function. diff --git a/src/ov.cc b/src/ov.cc --- a/src/ov.cc +++ b/src/ov.cc @@ -1304,173 +1304,69 @@ return rep->list_value (); } -ColumnVector -octave_value::column_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const +static dim_vector +make_vector_dims (const dim_vector& dv, bool force_vector_conversion, + const std::string& my_type, const std::string& wanted_type) { - ColumnVector retval; + dim_vector retval (dv); + retval.chop_trailing_singletons (); + octave_idx_type nel = dv.numel (); - Matrix m = matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nc == 1) + if (retval.length () > 2 || (retval(0) != 1 && retval(1) != 1)) { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real column vector"); + if (!force_vector_conversion) + gripe_implicit_conversion ("Octave:array-as-vector", + my_type.c_str (), wanted_type.c_str ()); + retval = dim_vector (nel); } return retval; } +ColumnVector +octave_value::column_vector_value (bool force_string_conv, + bool frc_vec_conv) const +{ + return ColumnVector (vector_value (force_string_conv, + frc_vec_conv)); +} + ComplexColumnVector octave_value::complex_column_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - ComplexColumnVector retval; - - ComplexMatrix m = complex_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex column vector"); - } - - return retval; + return ComplexColumnVector (complex_vector_value (force_string_conv, + frc_vec_conv)); } RowVector octave_value::row_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - RowVector retval; - - Matrix m = matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real row vector"); - } - - return retval; + return RowVector (vector_value (force_string_conv, + frc_vec_conv)); } ComplexRowVector octave_value::complex_row_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - ComplexRowVector retval; - - ComplexMatrix m = complex_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex row vector"); - } - - return retval; + return ComplexRowVector (complex_vector_value (force_string_conv, + frc_vec_conv)); } - -// Sloppy... Array octave_value::vector_value (bool force_string_conv, bool force_vector_conversion) const { - Array retval; - - Matrix m = matrix_value (force_string_conv); + Array retval = array_value (force_string_conv); if (error_state) return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } - else if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else if (nr > 0 && nc > 0) - { - if (! force_vector_conversion) - gripe_implicit_conversion ("Octave:array-as-vector", - type_name (), "real vector"); - - retval.resize (nr * nc); - octave_idx_type k = 0; - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - - retval (k++) = m (i, j); - } - } else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real vector"); - } - - return retval; + return retval.reshape (make_vector_dims (retval.dims (), + force_vector_conversion, + type_name (), "real vector")); } Array @@ -1479,364 +1375,124 @@ { Array retval; - Matrix m = matrix_value (force_string_conv); + if (is_integer_type ()) + { + // query for the first type that is wide enough +#if SIZEOF_INT == 2 + retval = int16_array_value (); +#elif SIZEOF_INT == 4 + retval = int32_array_value (); +#else + retval = int64_array_value (); +#endif + } + else + { + const NDArray a = array_value (force_string_conv); + if (! error_state) + { + if (require_int) + { + retval.resize (a.dims ()); + for (octave_idx_type i = 0; i < a.numel (); i++) + { + double ai = a.elem (i); + int v = static_cast (ai); + if (ai == v) + retval.xelem (i) = v; + else + { + error ("conversion to integer value failed"); + break; + } + } + } + else + retval = Array (a); + } + } + if (error_state) return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - { - OCTAVE_QUIT; - - double d = m (0, i); - - if (require_int && D_NINT (d) != d) - { - error ("conversion to integer value failed"); - return retval; - } - - retval (i) = static_cast (d); - } - } - else if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - - double d = m (i, 0); - - if (require_int && D_NINT (d) != d) - { - error ("conversion to integer value failed"); - return retval; - } - - retval (i) = static_cast (d); - } - } - else if (nr > 0 && nc > 0) - { - if (! force_vector_conversion) - gripe_implicit_conversion ("Octave:array-as-vector", - type_name (), "real vector"); - - retval.resize (nr * nc); - octave_idx_type k = 0; - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - - double d = m (i, j); - - if (require_int && D_NINT (d) != d) - { - error ("conversion to integer value failed"); - return retval; - } - - retval (k++) = static_cast (d); - } - } - } else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real vector"); - } - - return retval; + return retval.reshape (make_vector_dims (retval.dims (), + force_vector_conversion, + type_name (), "integer vector")); } Array octave_value::complex_vector_value (bool force_string_conv, - bool force_vector_conversion) const + bool force_vector_conversion) const { - Array retval; - - ComplexMatrix m = complex_matrix_value (force_string_conv); + Array retval = complex_array_value (force_string_conv); if (error_state) return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - { - OCTAVE_QUIT; - retval (i) = m (0, i); - } - } - else if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - retval (i) = m (i, 0); - } - } - else if (nr > 0 && nc > 0) - { - if (! force_vector_conversion) - gripe_implicit_conversion ("Octave:array-as-vector", - type_name (), "complex vector"); - - retval.resize (nr * nc); - octave_idx_type k = 0; - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - retval (k++) = m (i, j); - } - } else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex vector"); - } - - return retval; + return retval.reshape (make_vector_dims (retval.dims (), + force_vector_conversion, + type_name (), "complex vector")); } FloatColumnVector octave_value::float_column_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - FloatColumnVector retval; - - FloatMatrix m = float_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real column vector"); - } - - return retval; + return FloatColumnVector (float_vector_value (force_string_conv, + frc_vec_conv)); } FloatComplexColumnVector octave_value::float_complex_column_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - FloatComplexColumnVector retval; - - FloatComplexMatrix m = float_complex_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex column vector"); - } - - return retval; + return FloatComplexColumnVector (float_complex_vector_value (force_string_conv, + frc_vec_conv)); } FloatRowVector octave_value::float_row_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - FloatRowVector retval; - - FloatMatrix m = float_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real row vector"); - } - - return retval; + return FloatRowVector (float_vector_value (force_string_conv, + frc_vec_conv)); } FloatComplexRowVector octave_value::float_complex_row_vector_value (bool force_string_conv, - bool /* frc_vec_conv */) const + bool frc_vec_conv) const { - FloatComplexRowVector retval; + return FloatComplexRowVector (float_complex_vector_value (force_string_conv, + frc_vec_conv)); +} - FloatComplexMatrix m = float_complex_matrix_value (force_string_conv); +Array +octave_value::float_vector_value (bool force_string_conv, + bool force_vector_conversion) const +{ + Array retval = float_array_value (force_string_conv); if (error_state) return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex row vector"); - } - - return retval; -} - -// Sloppy... - -Array -octave_value::float_vector_value (bool force_string_conv, - bool force_vector_conversion) const -{ - Array retval; - - FloatMatrix m = float_matrix_value (force_string_conv); - - if (error_state) - return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - retval (i) = m (0, i); - } - else if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - retval (i) = m (i, 0); - } - else if (nr > 0 && nc > 0) - { - if (! force_vector_conversion) - gripe_implicit_conversion ("Octave:array-as-vector", - type_name (), "real vector"); - - retval.resize (nr * nc); - octave_idx_type k = 0; - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - - retval (k++) = m (i, j); - } - } - else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "real vector"); - } - - return retval; + return retval.reshape (make_vector_dims (retval.dims (), + force_vector_conversion, + type_name (), "real vector")); } Array octave_value::float_complex_vector_value (bool force_string_conv, - bool force_vector_conversion) const + bool force_vector_conversion) const { - Array retval; - - FloatComplexMatrix m = float_complex_matrix_value (force_string_conv); + Array retval = float_complex_array_value (force_string_conv); if (error_state) return retval; - - octave_idx_type nr = m.rows (); - octave_idx_type nc = m.columns (); - - if (nr == 1) - { - retval.resize (nc); - for (octave_idx_type i = 0; i < nc; i++) - { - OCTAVE_QUIT; - retval (i) = m (0, i); - } - } - else if (nc == 1) - { - retval.resize (nr); - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - retval (i) = m (i, 0); - } - } - else if (nr > 0 && nc > 0) - { - if (! force_vector_conversion) - gripe_implicit_conversion ("Octave:array-as-vector", - type_name (), "complex vector"); - - retval.resize (nr * nc); - octave_idx_type k = 0; - for (octave_idx_type j = 0; j < nc; j++) - for (octave_idx_type i = 0; i < nr; i++) - { - OCTAVE_QUIT; - retval (k++) = m (i, j); - } - } else - { - std::string tn = type_name (); - gripe_invalid_conversion (tn.c_str (), "complex vector"); - } - - return retval; + return retval.reshape (make_vector_dims (retval.dims (), + force_vector_conversion, + type_name (), "complex vector")); } int