sub2ind() errors out with NaN inputs - handled differently since R2024a

>> matlabRelease
ans =
matlabRelease with properties:
Release: "R2022b"
Stage: "release"
Update: 3
Date: 17-Nov-2022
>> sub2ind([ 3 5 7], [ 3 3], [2 2], [1 nan])
ans =
6 NaN
versus
>> matlabRelease
ans =
matlabRelease with properties:
Release: "R2024b"
Stage: "release"
Update: 4
Date: 26-Dec-2024
>> sub2ind([ 3 5 7], [ 3 3], [2 2], [1 nan])
Error using sub2ind (line 71)
Out of range subscript.

2 Comments

That change probably came with R2024a, which had the following documented change to sub2ind:
The sub2ind (R2024a) function now supports scalar expansion and accepts a mix of scalars and vectors for subscript inputs. For example, sub2ind(sz,[1 2 3],2) is now the same as sub2ind(sz,[1 2 3],[2 2 2]). Previously, the subscript inputs were required to be the same size.
I suspect you are correct - but then the issue is that R2024a added some nice functionality, yet removed a minor aspect of its backward compatibility. If that removal wasn't intentional, maybe it could be undone? Either way I would think it should be documented or fixed in subsequent release.

Sign in to comment.

 Accepted Answer

You can get the old behavior back if you need it,
Sub2Ind([ 3 5 7], [ 3 3], [2 2], [1 nan])
ans = 1×2
6 NaN
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
function out=Sub2Ind(sz,varargin)
out=varargin{1};
for i=2:numel(varargin)
out=out+(varargin{i}-1)*(sz(i-1));
end
end

1 Comment

Thank you - looking at the original code for this , i would've expected something way more complicated. Thank you very much.

Sign in to comment.

More Answers (1)

This was a bug fix introduced in release R2024a.

3 Comments

The previous behavior was considered a bug? This is fine - although it might reasonably be expected to be a feature. At least we're just talking abnout definitions - "bug" vs. "feature".
Generally, my mental model for the workflow for sub2ind (from the name) is that what comes out ought to be a valid linear index into an array that selects the same element as the subscripts you passed into the function. NaN is neither a valid subscript nor a valid linear index. Nor is 0.
I = sub2ind([10 10], 1, 0)
Error using sub2ind (line 71)
Out of range subscript.
Perhaps the error message could be more descriptive.
That is one way to handle it. And I agree that is a rather uninformative error message. But, it is a little deeper than that I think. If, by off chance, it it fed in a nan value, it could (and did prior to R2024a) return a nan for the appropriate index. The newer version removed that functionality, but added another facet of funcationality in being able to handle inputs of different sizes.
This would provide a higher degree of backward compatibility it would seem. But perhaps I am missing something. Not a major deal I suppose.

Sign in to comment.

Categories

Products

Release

R2024b

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!