bugGNU Octave - Bugs: bug #45820, linspace() incompatibility with...

 
 

bug #45820: linspace() incompatibility with Matlab when N < 2

Submitted by:  José Luis García Pallero <jgpallero>
Submitted on:  Tue 25 Aug 2015 11:42:01 AM UTC  
 
Category:  Octave Function Severity:  3 - Normal
Priority:  5 - Normal Item Group:  Matlab Compatibility
Status:  Fixed Assigned to:  None
Originator Name:  Open/Closed:  Closed
Release:  dev Operating System:  Any

Add a New Comment (Rich Markup)
   

You are not logged in

Please log in, so followups can be emailed to you.

 

( Jump to the original submission)

Sat 29 Aug 2015 02:16:21 PM UTC, comment #14: 

I fixed this to be Matlab compatible on the development branch in this changeset (http://hg.savannah.gnu.org/hgweb/octave/rev/16b9ec39ff46).  Closing report.

Rik <rik5>
Project Administrator
Wed 26 Aug 2015 04:57:49 PM UTC, comment #13: 

It produces an error:

>>linspace (1, [], 3)
Error using .*
Matrix dimensions must agree.

Error in linspace (line 30)

Guillaume <gyom>
Wed 26 Aug 2015 04:32:59 PM UTC, comment #12: 

Thanks Guillaume for testing with an ancient version of Matlab.  I think it is safe to bring Octave up to date and announce the change in the NEWS file.

One last test

linspace (1, [], 3)

Does this silently return an empty matrix or does it produce an error because the second input is invalid?

Rik <rik5>
Project Administrator
Wed 26 Aug 2015 10:52:27 AM UTC, comment #11: 

There has indeed been a change in MATLAB's behavior.

R2010b returns:

>> linspace(1,10,0)

ans =

    10

while R2011a returns:

>> linspace(1,10,0)

ans =

   Empty matrix: 1-by-0

The help text is the same in both releases:

For N < 2, LINSPACE returns X2.

but with recent versions of MATLAB, it now states:

For N = 1, LINSPACE returns X2.

Guillaume <gyom>
Wed 26 Aug 2015 08:16:18 AM UTC, comment #10: 

Oopsie that was the wrong window... (Octave)

Here's what ML r2014a really says:

>> x = [1:5]';
linspace (x, 10, 0)
ans =
Error using  .*
Matrix dimensions must agree.

Error in linspace ...   <ML code snipped>

Philip Nienhuis <philipnienhuis>
Project Member
Wed 26 Aug 2015 08:09:42 AM UTC, comment #9: 

@Rik, comment #7:
ML r2014a does this:

>> x = [1:5]';
>> linspace (x, 10, 0)
ans =

   10
   10
   10
   10
   10

>>

so it isn't quite empty as you expected.....

Philip Nienhuis <philipnienhuis>
Project Member
Wed 26 Aug 2015 12:25:27 AM UTC, comment #8: 

Attached is an attempt at a cset for this.  It appears to work. 

One of the things I get from reading the Matlab documentation is that matrices and vectors are not accepted inputs.  I kind of agree that matrices don't make much sense.  Maybe we should delete the implementation for that?  On the other hand, I do kind of like the ability to use vectors.  But if the input is a row vector, shouldn't the result be expanded down rather than across?  It appears that the input is always made a column vector before expanding.

linspace ([1 2 3], 4, 3)
ans =

   1.0000   2.5000   4.0000
   2.0000   3.0000   4.0000
   3.0000   3.5000   4.0000

(file #34730)

Rik <rik5>
Project Administrator
Tue 25 Aug 2015 11:34:19 PM UTC, comment #7: 

Octave gets the single/double distinction correct.  Here is a part of the code in data.cc for Flinspace

octave_value arg_1 = args(0);
octave_value arg_2 = args(1);

if (arg_1.is_single_type () || arg_2.is_single_type ())
  {
    if (arg_1.is_complex_type () || arg_2.is_complex_type ())
      retval = do_linspace<FloatComplexMatrix> (arg_1, arg_2, npoints);
    else
      retval = do_linspace<FloatMatrix> (arg_1, arg_2, npoints);

  }
else
  {
    if (arg_1.is_complex_type () || arg_2.is_complex_type ())
      retval = do_linspace<ComplexMatrix> (arg_1, arg_2, npoints);
    else
      retval = do_linspace<Matrix> (arg_1, arg_2, npoints);
  }

What does Matlab return for this?

x = [1:5]';
linspace (x, 10, 0)

It should be empty, but I wonder if the dimensions are 5x0?  Although, I'm not certain that we need to copy them exactly in that regard.

Rik <rik5>
Project Administrator
Tue 25 Aug 2015 10:21:39 PM UTC, comment #6: 

Forgot to tack these on the end...


>> class(linspace(1, single(10), 10))
ans =
single
>> class(linspace(1, 10, single(10)))
ans =
double

So only floating point arrays are valid, double or single, and the types of the first two arguments work according to the normal casting rules, type of 3rd argument doesn't matter.

Mike Miller <mtmiller>
Project Administrator
Tue 25 Aug 2015 10:19:19 PM UTC, comment #5: 

>> linspace(10, 20, 2)
ans =
    10    20
>> linspace(10, 20, 1)
ans =
    20
>> linspace(10, 20, 0)
ans =
   Empty matrix: 1-by-0
>> linspace(10, 20, -1)
ans =
   Empty matrix: 1-by-0

>> linspace(uint8(1), uint8(10), uint8(10))
Error using .*
Integers can only be combined with integers of the same class, or scalar doubles.

>> class(linspace(1, 10, 10))
ans =
double
>> class(linspace(1, 10, uint8(10))
ans =
double
>> class(linspace(single(1), 10, 10))
ans =
single

Mike Miller <mtmiller>
Project Administrator
Tue 25 Aug 2015 07:01:35 PM UTC, comment #4: 

I don't know what behavior to match, but the code in Octave is quite clear.  As an example, liboctave/array/dMatrix.cc begins with

Matrix linspace (const ColumnVector& x1,
                 const ColumnVector& x2,
                 octave_idx_type n)

{
  if (n < 1) n = 1;

which guarantees that at least one element is returned regardless of the value of N.

Rik <rik5>
Project Administrator
Tue 25 Aug 2015 05:00:26 PM UTC, comment #3: 

I can't be sure or check now, but I'll bet that the strange behavior matches some old version of Matlab, even for negative values of N.

For sure, the fact that Matlab returns a 1x0 sized array is a new thing because old versions of Matlab did not have empty arrays with some non-zero dimensions.

Also, how does Matlab's linspace work for non-double arguments?  It looks like Octave doesn't preserve the type of the argument, so a double array is produced for something like

linspace (uint8(1), uint8(10), uint8(10))

Also, what does Matlab do if the types of the arguments don't match?

I'm guessing that's another compatibility problem that could be a separate bug report.

John W. Eaton <jwe>
Project Administrator
Tue 25 Aug 2015 04:47:16 PM UTC, comment #2: 

I think there was already some special handling for linspace when N is small.  According to the documentation,

For compatibility with MATLAB, return the second argument (LIMIT)
if fewer than two values are requested.

What I think is supposed to happen is that for linspace (BASE, LIMIT, 1) it should return LIMIT rather than BASE.  But for linspace (BASE, LIMIT, 0) it does seem that an empty matrix rather than LIMIT should be returned.

Just to check, can the original reporter run the following examples in Matlab and report the results?

linspace (10, 20, 2)
linspace (10, 20, 1)
linspace (10, 20, 0)
linspace (10, 20, -1)

Octave is a little strange because even for -1 it returns 20 which is most likely to be incorrect.

Rik <rik5>
Project Administrator
Tue 25 Aug 2015 01:24:45 PM UTC, comment #1: 

Confirmed w. Octave-4.1.0+ (tip from Aug. 25, 2015) and verified in ML r2014a.

Release -> dev  +  typo in title fixed.

Philip Nienhuis <philipnienhuis>
Project Member
Tue 25 Aug 2015 11:42:01 AM UTC, original submission:  

Hello:

In Octave, linspace(10,20,0) returns

ans = 20

while in Matlab, the same order returns

ans = Empty matrix: 1-by-0

I think this is an incompatibility issue. I'm using Octave 4.0, so I don't know if the behavior is also present in old releases

José Luis García Pallero <jgpallero>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:
   
   
Comment:
   

Attached Files
file #34730:  linspace.cset added by rik5 (6KiB - application/octet-stream)

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by gyom (Posted a comment)
  • -email is unavailable- added by mtmiller (Posted a comment)
  • -email is unavailable- added by jwe (Posted a comment)
  • -email is unavailable- added by rik5 (Posted a comment)
  • -email is unavailable- added by jgpallero (Submitted the item)
  •  

    Do you think this task is very important?
    If so, you can add your encouragement to it.
    This task has 0 encouragements so far.

    Only project members can vote.

     

     

     

    Follow 7 latest changes.

    Date Changed by Updated Field Previous Value => Replaced by
    2015-08-29 rik5 StatusConfirmed => Fixed
        Open/ClosedOpen => Closed
    2015-08-26 rik5 Attached File- => Added linspace.cset, #34730
    2015-08-25 rik5 Summarylinspace() incompatibility with Matlab, argumento \'N\' => linspace() incompatibility with Matlab when N < 2
    2015-08-25 philipnienhuis StatusNone => Confirmed
        Release4.0.0 => dev
        Summarylinspace() incampatibility with Matlab, argumento \'N\' => linspace() incompatibility with Matlab, argumento 'N'

    Back to the top


    Powered by Savane 3.5