Mercurial > octave-nkf
diff libinterp/octave-value/ov.cc @ 19425:385499581a5e
allow disabling of permutation and diagonal matrices
* ov.cc (Vdisable_diagonal_matrix, Vdisable_permutation_matrix):
New static variables. Use them in octave_value constructors to
determine whether to create diagonal and permutation matrices.
(Fdisable_diagonal_matrix, Fdisable_permutation_matrix):
New functions.
* octave.cc (maximum_braindamage): Disable permutation and diagonal
matrices for --traditional option.
* CMatrix.cc, CMatrix.h, dMatrix.cc, dMatrix.h, fCMatrix.cc,
fCMatrix.h, fMatrix.cc, fMatrix.h: New conversion constructors.
* basics.txi, diagperm.txi: Update docs for change.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 08 Dec 2014 10:14:00 -0500 |
parents | f958e8cd6348 |
children | b39cbe9f3bb0 |
line wrap: on
line diff
--- a/libinterp/octave-value/ov.cc Sat Dec 06 22:26:32 2014 -0800 +++ b/libinterp/octave-value/ov.cc Mon Dec 08 10:14:00 2014 -0500 @@ -95,6 +95,14 @@ // make the grow_size large. DEFINE_OCTAVE_ALLOCATOR2(octave_value, 1024); +// If TRUE, don't create special diagonal matrix objects. + +static bool Vdisable_diagonal_matrix = false; + +// If TRUE, don't create special permutation matrix objects. + +static bool Vdisable_permutation_matrix = false; + // FIXME // Octave's value type. @@ -674,37 +682,49 @@ } octave_value::octave_value (const DiagArray2<double>& d) - : rep (new octave_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_matrix (Matrix (d))) + : dynamic_cast<octave_base_value *> (new octave_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const DiagArray2<float>& d) - : rep (new octave_float_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_float_matrix (FloatMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_float_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const DiagArray2<Complex>& d) - : rep (new octave_complex_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_complex_matrix (ComplexMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_complex_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const DiagArray2<FloatComplex>& d) - : rep (new octave_float_complex_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_float_complex_matrix (FloatComplexMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_float_complex_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const DiagMatrix& d) - : rep (new octave_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_matrix (Matrix (d))) + : dynamic_cast<octave_base_value *> (new octave_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const FloatDiagMatrix& d) - : rep (new octave_float_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_float_matrix (FloatMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_float_diag_matrix (d))) { maybe_mutate (); } @@ -782,13 +802,17 @@ } octave_value::octave_value (const ComplexDiagMatrix& d) - : rep (new octave_complex_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_complex_matrix (ComplexMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_complex_diag_matrix (d))) { maybe_mutate (); } octave_value::octave_value (const FloatComplexDiagMatrix& d) - : rep (new octave_float_complex_diag_matrix (d)) + : rep (Vdisable_diagonal_matrix + ? dynamic_cast<octave_base_value *> (new octave_float_complex_matrix (FloatComplexMatrix (d))) + : dynamic_cast<octave_base_value *> (new octave_float_complex_diag_matrix (d))) { maybe_mutate (); } @@ -818,7 +842,9 @@ } octave_value::octave_value (const PermMatrix& p) - : rep (new octave_perm_matrix (p)) + : rep (Vdisable_permutation_matrix + ? dynamic_cast<octave_base_value *> (new octave_matrix (Matrix (p))) + : dynamic_cast<octave_base_value *> (new octave_perm_matrix (p))) { maybe_mutate (); } @@ -3148,3 +3174,73 @@ %!error is_dq_string () %!error is_dq_string ("foo", 2) */ + +DEFUN (disable_permutation_matrix, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {@var{val} =} disable_permutation_matrix ()\n\ +@deftypefnx {Built-in Function} {@var{old_val} =} disable_permutation_matrix (@var{new_val})\n\ +@deftypefnx {Built-in Function} {} disable_permutation_matrix (@var{new_val}, \"local\")\n\ +Query or set the internal variable that controls whether permutation\n\ +matrices are stored in a special space-efficient format. The default\n\ +value is true. If this option is disabled Octave will store permutation\n\ +matrices as full matrices.\n\ +\n\ +When called from inside a function with the @qcode{\"local\"} option, the\n\ +variable is changed locally for the function and any subroutines it calls.\n\ +The original variable value is restored when exiting the function.\n\ +@end deftypefn") +{ + return SET_INTERNAL_VARIABLE (disable_permutation_matrix); +} + +/* +%!function p = __test_dpm__ (dpm) +%! disable_permutation_matrix (dpm, "local"); +%! [~, ~, p] = lu ([1,2;3,4]); +%!endfunction + +%!assert (typeinfo (__test_dpm__ (false)), "permutation matrix"); +%!assert (typeinfo (__test_dpm__ (true)), "matrix"); +*/ + +DEFUN (disable_diagonal_matrix, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {@var{val} =} disable_diagonal_matrix ()\n\ +@deftypefnx {Built-in Function} {@var{old_val} =} disable_diagonal_matrix (@var{new_val})\n\ +@deftypefnx {Built-in Function} {} disable_diagonal_matrix (@var{new_val}, \"local\")\n\ +Query or set the internal variable that controls whether diagonal\n\ +matrices are stored in a special space-efficient format. The default\n\ +value is true. If this option is disabled Octave will store diagonal\n\ +matrices as full matrices.\n\ +\n\ +When called from inside a function with the @qcode{\"local\"} option, the\n\ +variable is changed locally for the function and any subroutines it calls.\n\ +The original variable value is restored when exiting the function.\n\ +@end deftypefn") +{ + return SET_INTERNAL_VARIABLE (disable_diagonal_matrix); +} + +/* +%!function [x, xi, fx, fxi] = __test_ddm__ (ddm) +%! disable_diagonal_matrix (ddm, "local"); +%! x = eye (2); +%! xi = x*i; +%! fx = single (x); +%! fxi = single (xi); +%!endfunction + +%!shared x, xi, fx, fxi +%! [x, xi, fx, fxi] = __test_ddm__ (false); +%!assert (typeinfo (x), "diagonal matrix"); +%!assert (typeinfo (xi), "complex diagonal matrix"); +%!assert (typeinfo (fx), "float diagonal matrix"); +%!assert (typeinfo (fxi), "float complex diagonal matrix"); + +%!shared x, xi, fx, fxi +%! [x, xi, fx, fxi] = __test_ddm__ (true); +%!assert (typeinfo (x), "matrix"); +%!assert (typeinfo (xi), "complex matrix"); +%!assert (typeinfo (fx), "float matrix"); +%!assert (typeinfo (fxi), "float complex matrix"); +*/