diff --git a/libinterp/corefcn/data.cc b/libinterp/corefcn/data.cc --- a/libinterp/corefcn/data.cc +++ b/libinterp/corefcn/data.cc @@ -3837,6 +3837,8 @@ fill_matrix (const octave_value_list& ar 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 ()) { @@ -3846,6 +3848,18 @@ fill_matrix (const octave_value_list& ar 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: @@ -3933,6 +3947,19 @@ fill_matrix (const octave_value_list& ar 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; } @@ -3947,6 +3974,8 @@ fill_matrix (const octave_value_list& ar 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 ()) { @@ -3956,6 +3985,18 @@ fill_matrix (const octave_value_list& ar 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: @@ -3998,6 +4039,19 @@ fill_matrix (const octave_value_list& ar 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; } @@ -4140,6 +4194,17 @@ fill_matrix (const octave_value_list& ar 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: @@ -4169,6 +4234,11 @@ fill_matrix (const octave_value_list& ar retval = boolNDArray (dims, val); + if (issparse) + { + retval = retval.sparse_bool_matrix_value (); + } + return retval; } @@ -4220,6 +4290,13 @@ val = ones (m,n, "uint8") %!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]) */ @@ -4282,6 +4359,13 @@ val = zeros (m,n, "uint8") %!assert (zeros (2, 3, "int8"), int8 ([0, 0, 0; 0, 0, 0])) %!assert (zeros (3, 2, "int8"), int8 ([0, 0; 0, 0; 0, 0])) %!assert (size (zeros (3, 4, 5, "int8")), [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])) + */ DEFUN (Inf, args, , @@ -4339,6 +4423,13 @@ DEFALIAS (inf, Inf); %!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")) @@ -4404,6 +4495,13 @@ DEFALIAS (nan, NaN); %!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")) @@ -4798,6 +4896,11 @@ values, return an array with given dimen 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}) @@ -4816,6 +4919,10 @@ values, return an array with given dimen 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)