# HG changeset patch # User Jaroslav Hajek # Date 1236337211 -3600 # Node ID a2878ba31a9e94e76389ccfd77100080fc2cc375 # Parent 485eabc0cfece1d0b97ce7d21c72ca9a3e7de62a add diag & perm matrix query methods to octave_value diff -r 485eabc0cfec -r a2878ba31a9e src/ChangeLog --- a/src/ChangeLog Fri Mar 06 01:07:04 2009 -0500 +++ b/src/ChangeLog Fri Mar 06 12:00:11 2009 +0100 @@ -1,3 +1,29 @@ +2009-03-06 Jaroslav Hajek + + * ov.h (octave_value::diag_matrix_value, + octave_value::complex_diag_matrix_value, + octave_value::float_diag_matrix_value, + octave_value::float_complex_diag_matrix_value, + octave_value::perm_matrix_value): New methods. + + * ov-base.cc (octave_base_value::diag_matrix_value, + octave_base_value::complex_diag_matrix_value, + octave_base_value::float_diag_matrix_value, + octave_base_value::float_complex_diag_matrix_value, + octave_base_value::perm_matrix_value): New virtual methods. + + * ov-base.h: Declare them. + + * ov-base-diag.h (octave_base_diag::diag_matrix_value, + octave_base_diag::complex_diag_matrix_value, + octave_base_diag::float_diag_matrix_value, + octave_base_diag::float_complex_diag_matrix_value, + octave_base_diag::perm_matrix_value): Remove declarations. + + * DLD-FUNCTIONS/inv.cc (Finv): Simplify handling diag & perm matrices. + * DLD-FUNCTIONS/pinv.cc (Fpinv): Ditto. + * DLD-FUNCTIONS/det.cc (Fdet): Ditto. + 2009-03-05 Jaroslav Hajek * ls-hdf5.cc (add_hdf5_data): Handle diag & perm matrices. diff -r 485eabc0cfec -r a2878ba31a9e src/DLD-FUNCTIONS/det.cc --- a/src/DLD-FUNCTIONS/det.cc Fri Mar 06 01:07:04 2009 -0500 +++ b/src/DLD-FUNCTIONS/det.cc Fri Mar 06 12:00:11 2009 +0100 @@ -95,56 +95,48 @@ if (arg.is_diag_matrix ()) { - const octave_base_value& a = arg.get_rep (); if (arg.is_complex_type ()) { if (isfloat) { - CAST_CONV_ARG (const octave_float_complex_diag_matrix&); - retval(0) = v.float_complex_diag_matrix_value ().determinant ().value (); + retval(0) = arg.float_complex_diag_matrix_value ().determinant ().value (); if (nargout > 1) - retval(1) = v.float_complex_diag_matrix_value ().rcond (); + retval(1) = arg.float_complex_diag_matrix_value ().rcond (); } else { - CAST_CONV_ARG (const octave_complex_diag_matrix&); - retval(0) = v.complex_diag_matrix_value ().determinant ().value (); + retval(0) = arg.complex_diag_matrix_value ().determinant ().value (); if (nargout > 1) - retval(1) = v.complex_diag_matrix_value ().rcond (); + retval(1) = arg.complex_diag_matrix_value ().rcond (); } } else { if (isfloat) { - CAST_CONV_ARG (const octave_float_diag_matrix&); - retval(0) = v.float_diag_matrix_value ().determinant ().value (); + retval(0) = arg.float_diag_matrix_value ().determinant ().value (); if (nargout > 1) - retval(1) = v.float_diag_matrix_value ().rcond (); + retval(1) = arg.float_diag_matrix_value ().rcond (); } else { - CAST_CONV_ARG (const octave_diag_matrix&); - retval(0) = v.diag_matrix_value ().determinant ().value (); + retval(0) = arg.diag_matrix_value ().determinant ().value (); if (nargout > 1) - retval(1) = v.diag_matrix_value ().rcond (); + retval(1) = arg.diag_matrix_value ().rcond (); } } } else if (arg.is_perm_matrix ()) { - const octave_base_value& a = arg.get_rep (); if (isfloat) { - CAST_CONV_ARG (const octave_float_perm_matrix&); - retval(0) = static_cast (v.perm_matrix_value ().determinant ()); + retval(0) = static_cast (arg.perm_matrix_value ().determinant ()); if (nargout > 1) retval(1) = 1.0; } else { - CAST_CONV_ARG (const octave_perm_matrix&); - retval(0) = static_cast (v.perm_matrix_value ().determinant ()); + retval(0) = static_cast (arg.perm_matrix_value ().determinant ()); if (nargout > 1) retval(1) = 1.0f; } diff -r 485eabc0cfec -r a2878ba31a9e src/DLD-FUNCTIONS/inv.cc --- a/src/DLD-FUNCTIONS/inv.cc Fri Mar 06 01:07:04 2009 -0500 +++ b/src/DLD-FUNCTIONS/inv.cc Fri Mar 06 12:00:11 2009 +0100 @@ -91,39 +91,34 @@ { rcond = 1.0; frcond = 1.0f; - const octave_base_value& a = arg.get_rep (); if (arg.is_complex_type ()) { if (isfloat) { - CAST_CONV_ARG (const octave_float_complex_diag_matrix&); - result = v.float_complex_diag_matrix_value ().inverse (info); + result = arg.float_complex_diag_matrix_value ().inverse (info); if (nargout > 1) - frcond = v.float_complex_diag_matrix_value ().rcond (); + frcond = arg.float_complex_diag_matrix_value ().rcond (); } else { - CAST_CONV_ARG (const octave_complex_diag_matrix&); - result = v.complex_diag_matrix_value ().inverse (info); + result = arg.complex_diag_matrix_value ().inverse (info); if (nargout > 1) - rcond = v.complex_diag_matrix_value ().rcond (); + rcond = arg.complex_diag_matrix_value ().rcond (); } } else { if (isfloat) { - CAST_CONV_ARG (const octave_float_diag_matrix&); - result = v.float_diag_matrix_value ().inverse (info); + result = arg.float_diag_matrix_value ().inverse (info); if (nargout > 1) - frcond = v.float_diag_matrix_value ().rcond (); + frcond = arg.float_diag_matrix_value ().rcond (); } else { - CAST_CONV_ARG (const octave_diag_matrix&); - result = v.diag_matrix_value ().inverse (info); + result = arg.diag_matrix_value ().inverse (info); if (nargout > 1) - rcond = v.diag_matrix_value ().rcond (); + rcond = arg.diag_matrix_value ().rcond (); } } } @@ -132,17 +127,10 @@ rcond = 1.0; frcond = 1.0f; info = 0; - const octave_base_value& a = arg.get_rep (); if (isfloat) - { - CAST_CONV_ARG (const octave_float_perm_matrix&); - result = v.perm_matrix_value ().inverse (); - } + result = octave_value (arg.perm_matrix_value ().inverse (), true); else - { - CAST_CONV_ARG (const octave_perm_matrix&); - result = v.perm_matrix_value ().inverse (); - } + result = arg.perm_matrix_value ().inverse (); } else if (isfloat) { diff -r 485eabc0cfec -r a2878ba31a9e src/DLD-FUNCTIONS/pinv.cc --- a/src/DLD-FUNCTIONS/pinv.cc Fri Mar 06 01:07:04 2009 -0500 +++ b/src/DLD-FUNCTIONS/pinv.cc Fri Mar 06 12:00:11 2009 +0100 @@ -79,47 +79,27 @@ if (nargin == 2) warning ("pinv: tol is ignored for diagonal matrices"); - const octave_base_value& a = arg.get_rep (); if (arg.is_complex_type ()) { if (isfloat) - { - CAST_CONV_ARG (const octave_float_complex_diag_matrix&); - retval = v.float_complex_diag_matrix_value ().pseudo_inverse (); - } + retval = arg.float_complex_diag_matrix_value ().pseudo_inverse (); else - { - CAST_CONV_ARG (const octave_complex_diag_matrix&); - retval = v.complex_diag_matrix_value ().pseudo_inverse (); - } + retval = arg.complex_diag_matrix_value ().pseudo_inverse (); } else { if (isfloat) - { - CAST_CONV_ARG (const octave_float_diag_matrix&); - retval = v.float_diag_matrix_value ().pseudo_inverse (); - } + retval = arg.float_diag_matrix_value ().pseudo_inverse (); else - { - CAST_CONV_ARG (const octave_diag_matrix&); - retval = v.diag_matrix_value ().pseudo_inverse (); - } + retval = arg.diag_matrix_value ().pseudo_inverse (); } } else if (arg.is_perm_matrix ()) { - const octave_base_value& a = arg.get_rep (); if (isfloat) - { - CAST_CONV_ARG (const octave_float_perm_matrix&); - retval = v.perm_matrix_value ().inverse (); - } + retval = octave_value (arg.perm_matrix_value ().inverse (), true); else - { - CAST_CONV_ARG (const octave_perm_matrix&); - retval = v.perm_matrix_value ().inverse (); - } + retval = arg.perm_matrix_value ().inverse (); } else if (isfloat) { diff -r 485eabc0cfec -r a2878ba31a9e src/ov-base-diag.h --- a/src/ov-base-diag.h Fri Mar 06 01:07:04 2009 -0500 +++ b/src/ov-base-diag.h Fri Mar 06 12:00:11 2009 +0100 @@ -136,14 +136,6 @@ idx_vector index_vector (void) const; - virtual DiagMatrix diag_matrix_value (bool = false) const = 0; - - virtual FloatDiagMatrix float_diag_matrix_value (bool = false) const = 0; - - virtual ComplexDiagMatrix complex_diag_matrix_value (bool = false) const = 0; - - virtual FloatComplexDiagMatrix float_complex_diag_matrix_value (bool = false) const = 0; - Matrix matrix_value (bool = false) const; FloatMatrix float_matrix_value (bool = false) const; diff -r 485eabc0cfec -r a2878ba31a9e src/ov-base.cc --- a/src/ov-base.cc Fri Mar 06 01:07:04 2009 -0500 +++ b/src/ov-base.cc Fri Mar 06 12:00:11 2009 +0100 @@ -608,6 +608,46 @@ return retval; } +DiagMatrix +octave_base_value::diag_matrix_value (bool) const +{ + DiagMatrix retval; + gripe_wrong_type_arg ("octave_base_value::diag_matrix_value()", type_name ()); + return retval; +} + +FloatDiagMatrix +octave_base_value::float_diag_matrix_value (bool) const +{ + FloatDiagMatrix retval; + gripe_wrong_type_arg ("octave_base_value::float_diag_matrix_value()", type_name ()); + return retval; +} + +ComplexDiagMatrix +octave_base_value::complex_diag_matrix_value (bool) const +{ + ComplexDiagMatrix retval; + gripe_wrong_type_arg ("octave_base_value::complex_diag_matrix_value()", type_name ()); + return retval; +} + +FloatComplexDiagMatrix +octave_base_value::float_complex_diag_matrix_value (bool) const +{ + FloatComplexDiagMatrix retval; + gripe_wrong_type_arg ("octave_base_value::float_complex_diag_matrix_value()", type_name ()); + return retval; +} + +PermMatrix +octave_base_value::perm_matrix_value (void) const +{ + PermMatrix retval; + gripe_wrong_type_arg ("octave_base_value::perm_matrix_value()", type_name ()); + return retval; +} + octave_int8 octave_base_value::int8_scalar_value (void) const { diff -r 485eabc0cfec -r a2878ba31a9e src/ov-base.h --- a/src/ov-base.h Fri Mar 06 01:07:04 2009 -0500 +++ b/src/ov-base.h Fri Mar 06 12:00:11 2009 +0100 @@ -396,6 +396,16 @@ virtual SparseBoolMatrix sparse_bool_matrix_value (bool = false) const; + virtual DiagMatrix diag_matrix_value (bool = false) const; + + virtual FloatDiagMatrix float_diag_matrix_value (bool = false) const; + + virtual ComplexDiagMatrix complex_diag_matrix_value (bool = false) const; + + virtual FloatComplexDiagMatrix float_complex_diag_matrix_value (bool = false) const; + + virtual PermMatrix perm_matrix_value (void) const; + virtual octave_int8 int8_scalar_value (void) const; virtual octave_int16 int16_scalar_value (void) const; diff -r 485eabc0cfec -r a2878ba31a9e src/ov.h --- a/src/ov.h Fri Mar 06 01:07:04 2009 -0500 +++ b/src/ov.h Fri Mar 06 12:00:11 2009 +0100 @@ -740,6 +740,21 @@ SparseBoolMatrix sparse_bool_matrix_value (bool frc_str_conv = false) const { return rep->sparse_bool_matrix_value (frc_str_conv); } + DiagMatrix diag_matrix_value (bool force = false) const + { return rep->diag_matrix_value (force); } + + FloatDiagMatrix float_diag_matrix_value (bool force = false) const + { return rep->float_diag_matrix_value (force); } + + ComplexDiagMatrix complex_diag_matrix_value (bool force = false) const + { return rep->complex_diag_matrix_value (force); } + + FloatComplexDiagMatrix float_complex_diag_matrix_value (bool force = false) const + { return rep->float_complex_diag_matrix_value (force); } + + PermMatrix perm_matrix_value (void) const + { return rep->perm_matrix_value (); } + octave_int8 int8_scalar_value (void) const { return rep->int8_scalar_value (); }