double indexing

143 vues (au cours des 30 derniers jours)
Frank
Frank le 12 Jan 2012
Modifié(e) : DGM le 20 Déc 2024
Hello,
is it possible to do double or multiple indexing in matlab? E.g.
>> v = [1,2,5,7,9]
v =
1 2 5 7 9
>> v(1:4)
ans =
1 2 5 7
>> v(1:4)(2:3)
ans =
2 5
The first index create a new vector and the second index creates a new vector out of the newly created one. It is common in other languages, and it helps to avoid defining temp variables.
Cheers, Frank
  2 commentaires
Katharina Wellstein
Katharina Wellstein le 20 Déc 2024
Modifié(e) : Walter Roberson le 20 Déc 2024
A simple way to do this would be by using intersect, a function that finds commonalities between different arrays.
In this case it would be:
[value, position] = intersect(v(1:4), v(2:3))
For more complicated things like indexing into an array (or matrix) with different indices, the same thing can be used. E.g. if I want to find numbers that are higher than 5 and numbers that are even in x, I can do the following:
x = randi(randi(10,10,1);
bigIdx = find(x>5);
evenIdx = ~mod(x,2);
x(intersect(bigIdx,evenIdx);
Walter Roberson
Walter Roberson le 20 Déc 2024
The hypothetical v(1:4)(2:3) is intended to select elements 1 through 4 of v, and then select elements 2 to 3 of that.
Suppose we had instead asked for v(2:4)(2:3), then that would be elements 2 to 3 out of elements 2 to 4, so the end result would be v(3:4) .
[value, position] = intersect(v(2:4), v(2:3))
would give back v(2:3) instead, at best.
If we had
v = [1,5,5,7,9]
then [value, position] = intersect(v(1:4), v(2:3)) would be interesect([1 5 5 7], [5 5]) which is going to return [5] rather than [5 5] because the return values of intersect() are sorted and unique by default.
Overall, intersect() is just the wrong thing to use here.

Connectez-vous pour commenter.

Réponse acceptée

Walter Roberson
Walter Roberson le 12 Jan 2012
The closest you can get is
subsref(V(1:4), struct('type', '()', 'subs', 2:3)))
You can follow {} referencing by () referencing, {}(), but you cannot use ()() or (){} or ().{} or ().(), and you cannot use function(){} or function()() or function().field
  3 commentaires
Petter
Petter le 11 Juil 2023
"You can follow {} referencing by () referencing, {}()"
This one line made my day so much easier, greatly appreciated. Thumbs up, gold star.
Walter Roberson
Walter Roberson le 20 Déc 2024
In the time since the above Answer was posted, Mathworks has since permitted function().field

Connectez-vous pour commenter.

Plus de réponses (2)

mklcst mklcst
mklcst mklcst le 23 Jan 2014
I think it could be very useful to have a short way to perform double indexing.

Jos (10584)
Jos (10584) le 23 Jan 2014
If the indices are stored in variables, this is trivial!
V = [1,2,5,7,9]
ii = 1:4
jj = [2 3]
out = V(ii(jj))
  2 commentaires
lee eugene
lee eugene le 2 Août 2019
However, if the two index do not have the same starting indexing, there would be something wrong. For example, i would like to select index [2,4] from [1,2,5,7,9] at first, and then select index [1,2]. Then it would be [2,5,7] at first and [2,5] in the end.
DGM
DGM le 20 Déc 2024
Modifié(e) : DGM le 20 Déc 2024
That's what the result is supposed to be.
That said, there's still room for problems if the index vectors are programmatically generated. We'd have to safeguard against out-of-range indices. Consider one possibility:
% a vector
V = [1,2,5,7,9];
% potentially out-of-range indices
ii = [1:4 7];
jj = [2 3 5];
% one option might be to simply
% discard invalid indices
ii = intersect(ii,1:numel(V))
ii = 1×4
1 2 3 4
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
jj = intersect(jj,1:numel(ii))
jj = 1×2
2 3
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
% so it still works without indexing errors
out = V(ii(jj))
out = 1×2
2 5
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
I'm sure there are other ways one might choose to handle it though. This might not be okay if you're not expecting to a different number of elements than what you requested. In that case, it might be better to just throw an error.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by