diff -r a36cb488fc97 libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc Wed Sep 25 10:27:33 2019 -0400 +++ b/libinterp/corefcn/data.cc Wed Sep 25 17:52:04 2019 +0100 @@ -3938,6 +3938,8 @@ oct_data_conv::data_type dt = oct_data_conv::dt_double; dim_vector dims (1, 1); + bool issparse = false; + bool iscomplex = false; if (nargin > 0 && args(nargin-1).is_string ()) { @@ -3947,6 +3949,18 @@ dt = oct_data_conv::string_to_data_type (nm); } + if (nargin > 1 && args(nargin-2).is_string () + && args(nargin-2).string_value () == "like" + && (std::string(fcn) == "ones" + || std::string(fcn) == "zeros")) + { + std::string nm = args(nargin-1).class_name (); + issparse = args(nargin-1).issparse (); + iscomplex = args(nargin-1).iscomplex (); + nargin -= 2; + dt = oct_data_conv::string_to_data_type (nm); + } + switch (nargin) { case 0: @@ -4032,6 +4046,19 @@ break; } + if (iscomplex) + retval = ComplexNDArray (dims, Complex(val, 0)); + + if (issparse) + { + if (retval.islogical ()) + retval = retval.sparse_bool_matrix_value (); + else if (retval.iscomplex ()) + retval = retval.sparse_complex_matrix_value (); + else if (retval.isnumeric ()) + retval = retval.sparse_matrix_value (); + } + return retval; } @@ -4046,6 +4073,8 @@ oct_data_conv::data_type dt = oct_data_conv::dt_double; dim_vector dims (1, 1); + bool issparse = false; + bool iscomplex = false; if (nargin > 0 && args(nargin-1).is_string ()) { @@ -4055,6 +4084,18 @@ dt = oct_data_conv::string_to_data_type (nm); } + if (nargin > 1 && args(nargin-2).is_string () + && args(nargin-2).string_value () == "like" + && (std::string(fcn) == "Inf" + || std::string(fcn) == "NaN")) + { + std::string nm = args(nargin-1).class_name (); + issparse = args(nargin-1).issparse (); + iscomplex = args(nargin-1).iscomplex (); + nargin -= 2; + dt = oct_data_conv::string_to_data_type (nm); + } + switch (nargin) { case 0: @@ -4096,6 +4137,19 @@ break; } + if (iscomplex) + retval = ComplexNDArray (dims, Complex(val, 0)); + + if (issparse) + { + if (retval.islogical ()) + retval = retval.sparse_bool_matrix_value (); + else if (retval.iscomplex ()) + retval = retval.sparse_complex_matrix_value (); + else if (retval.isnumeric ()) + retval = retval.sparse_matrix_value (); + } + return retval; } @@ -4236,6 +4290,17 @@ dim_vector dims (1, 1); + bool issparse = false; + + if (nargin > 1 && args(nargin-2).is_string () + && args(nargin-2).string_value () == "like" + && (std::string(fcn) == "true" + || std::string(fcn) == "false")) + { + issparse = args(nargin-1).issparse (); + nargin -= 2; + } + switch (nargin) { case 0: @@ -4264,6 +4329,11 @@ retval = boolNDArray (dims, val); + if (issparse) + { + retval = retval.sparse_bool_matrix_value (); + } + return retval; } @@ -4315,6 +4385,13 @@ %!assert (ones (3, "int8"), int8 ([1, 1, 1; 1, 1, 1; 1, 1, 1])) %!assert (ones (2, 3, "int8"), int8 ([1, 1, 1; 1, 1, 1])) %!assert (ones (3, 2, "int8"), int8 ([1, 1; 1, 1; 1, 1])) + +%!assert (ones (2, 2, 'like', sparse(ones(2, 2))), sparse([1, 1; 1, 1])) +%!assert (ones (2, 2, 'like', complex(ones(2, 2))), [1, 1; 1, 1]) +%!assert (ones (1, 2, 'like', single(1)), single([1, 1])) +%!assert (ones (2, 2, 'like', double(1)), double([1, 1; 1, 1])) +%!assert (ones (2, 2, 'like', uint8(8)), uint8([1, 1; 1, 1])) + %!assert (size (ones (3, 4, 5, "int8")), [3, 4, 5]) %!assert (size (ones (1, -2, 2)), [1, 0, 2]) @@ -4375,6 +4452,12 @@ %!assert (zeros (3, 2), [0, 0; 0, 0; 0, 0]) %!assert (size (zeros (3, 4, 5)), [3, 4, 5]) +%!assert (zeros (2, 2, 'like', sparse (ones (2, 2))), sparse ([0, 0; 0, 0])) +%!assert (zeros (2, 2, 'like', complex (ones (2, 2))), [0, 0; 0, 0]) +%!assert (zeros (1, 2, 'like', single (1)), single ([0, 0])) +%!assert (zeros (2, 2, 'like', double (1)), double ([0, 0; 0, 0])) +%!assert (zeros (2, 2, 'like', uint8 (8)), uint8 ([0, 0; 0, 0])) + %!assert (zeros (3, "single"), single ([0, 0, 0; 0, 0, 0; 0, 0, 0])) %!assert (zeros (2, 3, "single"), single ([0, 0, 0; 0, 0, 0])) %!assert (zeros (3, 2, "single"), single ([0, 0; 0, 0; 0, 0])) @@ -4449,6 +4532,13 @@ %!assert (inf (3, 2, "single"), single ([Inf, Inf; Inf, Inf; Inf, Inf])) %!assert (size (inf (3, 4, 5, "single")), [3, 4, 5]) +%!assert (inf (2, 2, 'like', sparse (ones (2, 2))), sparse ([Inf, Inf; Inf, Inf])) +%!assert (inf (2, 2, 'like', complex (ones (2, 2))), [Inf, Inf; Inf, Inf]) +%!assert (inf (3, 3, 'like', single (1)), single ([Inf, Inf, Inf; Inf, Inf, Inf; Inf, Inf, Inf])) +%!assert (inf (2, 2, 'like', double (1)), double ([Inf, Inf; Inf, Inf])) + +%!error (inf (3, 'like', int8 (1))) + %!error (inf (3, "int8")) %!error (inf (2, 3, "int8")) %!error (inf (3, 2, "int8")) @@ -4514,6 +4604,13 @@ %!assert (NaN (3, 2, "single"), single ([NaN, NaN; NaN, NaN; NaN, NaN])) %!assert (size (NaN (3, 4, 5, "single")), [3, 4, 5]) +%!assert (NaN (2, 2, 'like', sparse (ones (2, 2))), sparse ([NaN, NaN; NaN, NaN])) +%!assert (NaN (2, 2, 'like', complex (ones(2, 2))), [NaN, NaN; NaN, NaN]) +%!assert (NaN (3, 3, 'like', single (1)), single ([NaN, NaN, NaN; NaN, NaN, NaN; NaN, NaN, NaN])) +%!assert (NaN (2, 2, 'like', double (1)), double ([NaN, NaN; NaN, NaN])) + +%!error (NaN (3, 'like', int8 (1))) + %!error (NaN (3, "int8")) %!error (NaN (2, 3, "int8")) %!error (NaN (3, 2, "int8")) @@ -4896,6 +4993,11 @@ return fill_matrix (args, false, "false"); } +/* +%!assert (false (2, 1, 'like', sparse (1)), sparse ([false; false])) +%!assert (false (2, 1, 'like', double (1)), [false; false]) ++*/ + DEFUN (true, args, , doc: /* -*- texinfo -*- @deftypefn {} {} true (@var{x}) @@ -4914,6 +5016,11 @@ return fill_matrix (args, true, "true"); } +/* +%!assert (true (2, 1, 'like', sparse (1)), sparse([true; true])) +%!assert (true (2, 1, 'like', double (1)), [true; true]) +*/ + template octave_value identity_matrix (int nr, int nc)