# HG changeset patch # User Marco Caliari # Date 1387299634 28800 # Node ID a86d608c413c3ab2dde88715095ec6c7b090d5a1 # Parent b5970988ccff73eb01e6d02e19a8e77c8219091a Return empty matrix rather than issuing error when requested diagonal is out of range. * data.cc: Add %!tests for new behavior. * Array.cc (diag): Return 0x1 empty matrix when diagonal is out of range. * DiagArray2.cc (extract_diag): Return 0x1 empty matrix when diagonal is out of range. * Sparse.cc (diag): Return 0x1 empty matrix when diagonal is out of range. diff -r b5970988ccff -r a86d608c413c libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc Tue Dec 17 13:28:31 2013 +0000 +++ b/libinterp/corefcn/data.cc Tue Dec 17 09:00:34 2013 -0800 @@ -1354,6 +1354,11 @@ %!assert (diag ({1}, 2, 3), {1,[],[]; [],[],[]}); %!assert (diag ({1,2}, 3, 4), {1,[],[],[]; [],2,[],[]; [],[],[],[]}); +## Test out-of-range diagonals +%!assert (diag (ones (3,3), 4), zeros (0, 1)) +%!assert (diag (cell (3,3), 4), cell (0, 1)) +%!assert (diag (sparse (ones (3,3)), 4), sparse (zeros (0, 1))) + %% Test input validation %!error diag () %!error diag (1,2,3,4) diff -r b5970988ccff -r a86d608c413c liboctave/array/Array.cc --- a/liboctave/array/Array.cc Tue Dec 17 13:28:31 2013 +0000 +++ b/liboctave/array/Array.cc Tue Dec 17 09:00:34 2013 -0800 @@ -2571,9 +2571,8 @@ d.xelem (i) = elem (i, i); } } - else - (*current_liboctave_error_handler) - ("diag: requested diagonal out of range"); + else // Matlab returns [] 0x1 for out-of-range diagonal + d.resize (dim_vector (0, 1)); } else { diff -r b5970988ccff -r a86d608c413c liboctave/array/DiagArray2.cc --- a/liboctave/array/DiagArray2.cc Tue Dec 17 13:28:31 2013 +0000 +++ b/liboctave/array/DiagArray2.cc Tue Dec 17 09:00:34 2013 -0800 @@ -66,9 +66,8 @@ d = Array (dim_vector (std::min (cols () - k, rows ()), 1), T ()); else if (k < 0 && -k < rows ()) d = Array (dim_vector (std::min (rows () + k, cols ()), 1), T ()); - else - (*current_liboctave_error_handler) - ("diag: requested diagonal out of range"); + else // Matlab returns [] 0x1 for out-of-range diagonal + d.resize (dim_vector (0, 1)); return d; } diff -r b5970988ccff -r a86d608c413c liboctave/array/Sparse.cc --- a/liboctave/array/Sparse.cc Tue Dec 17 13:28:31 2013 +0000 +++ b/liboctave/array/Sparse.cc Tue Dec 17 09:00:34 2013 -0800 @@ -2490,9 +2490,8 @@ } } } - else - (*current_liboctave_error_handler) - ("diag: requested diagonal out of range"); + else // Matlab returns [] 0x1 for out-of-range diagonal + d = Sparse (0, 1, 0); } else if (nnr != 0 && nnc != 0) {