Indexing via 3d array changed behaviour 2015a -> 2015b?

Sven (view profile)

on 15 Oct 2015
Latest activity Commented on by Scott French

on 21 Oct 2015

Scott French (view profile)

Hi all, just got 2015b, here's a strange one where indexing via a multidimensional array has a differently shaped output to previous versions:
Code:
a = 1:10;
b = reshape(4:6,1,1,[]);
a(b)
2015a and before:
ans(:,:,1) =
4
ans(:,:,2) =
5
ans(:,:,3) =
6
2015b:
ans =
4 5 6
I searched through the release notes and couldn't find anything that relates to this behaviour change. Did I miss something? Or is this a bug that I should report?

David Young

David Young (view profile)

on 15 Oct 2015
I really hope someone answers this! It's very worrying that something as fundamental as array indexing might have quietly changed between versions. Of course the underlying problem is the inconsistent way indexing is applied to A(B) if both A and B are vectors. Since in this case isvector(b) returns 0, I think that the pre-2015b results are "correct", so to me it looks like a bug.

Scott French (view profile)

on 20 Oct 2015

This was an intentional change/bug fix. Prior to R2015b, there was an inconsistency in the MATLAB indexing behavior - if you try your experiment in R2015a, but with the value of "a" being stored in a field of a struct, or an element of a cell, you'd get a different answer:
>> s.a = 1:10
s =
a: [1 2 3 4 5 6 7 8 9 10]
>> b=reshape(4:6, 1, 1, []);
>> s.a(b)
ans =
4 5 6
It didn't seem reasonable that the same value could be indexed by the same index, but give different results depending on where the value came from. So we changed it to give the same result.
The rule that we apply is, for an expression R(I) where R and I both have only one non-singleton dimension, then the dimensions of the result have the length of I, and the orientation of R.
Scott

Scott French

Scott French (view profile)

on 21 Oct 2015
Thank you both, Walter and Sven, for the feedback. I will make sure the rest of the indexing developers see it.
Sven, we actually did consider dropping rule 2 altogether, and when we prototyped it, enough current MATLAB code broke in our own products that we decided it would be unacceptable to customers. Balancing inconsistencies within a version of MATLAB versus inconsistencies across versions is a tricky task, but one that we take seriously.
Walter Roberson

Walter Roberson (view profile)

on 21 Oct 2015
Perhaps some kind of "strict vector orientation" setting could be added. Make it easy to use. Maybe put some detection into the code analyzer as a "best practice". Especially if you can add a convenient notation for "reshape this expression as a row vector" -- something easier than INDEXABLEEXPRESSION(:).' and something cleaner than reshape(NONINDEXABLEEXPRESSION,1,[]) . Maybe a ." operator?
Anyhow, do you have the facility for scoped pragmas? So someone could code
for K = 1 : 50 %#svo
... this code is under Strict Vector Orientation pragma
end
... the scope of %#svo ended
function myfunction %#svo
... entire function or subfunction is under %#svo
for K = 1 : 50 %#nosvo
... except this section
end
... we are back to %#svo
function mysubfunction
... subfunctions are scoped and so inherit %#svo or not
end
end
What would %#svo do, exactly? I'm not sure at the moment, but at the very least it would mean that assigning a vector of the wrong orientation to a vector slot would be detected as a shape error. Perhaps it should also mean that using the built-in routines that do automatic first-nonsingular dimension choice should be an error unless the dimension is explicitly provided. Maybe it should also mean Sven's Rule #2 should not be in effect.
One thing that needs to be distinguished is single index versus multiple index. R(I,J) should probably not depend upon the shape of I or J.
Hmmm... there is going to be a lot of code where a column vector is indexed by a row vector . Using R((I).') isn't so bad, but it would be nice if there was a column-vector form of P:Q without having to code (P:Q).'
Ramble.
Scott French

Scott French (view profile)

on 21 Oct 2015
Ramble cheerfully accepted.