How to Apply Logical Indexing and Then a Subscript to a Vector in One Line of Code
27 views (last 30 days)
Show older comments
Let's say I have a vector
a=(linspace(1,10,10))';
And a set of logicals to shrink this vector
b=logical(zeros(10,1));
b([1:2, 5:6])=logical(1);
c= a(b);
And d is a subcript(s) that comes from some other vector (e) that is the same size as c
e=rand(size(a(b),1),1);
[~,d]=max(e);
Now I want to create vector f
f=c(d);
However, I would like to avoid this middle step of creating and calling for c due to the size of my vectors. The theoretical b and d vectors are readily available from previous steps. In my head, this looked like the following
f=(a(b))(d);
Unfortunately, that did not work. Any help is much appreciated.
0 Comments
Accepted Answer
Sean de Wolski
on 20 Mar 2015
MATLAB doesn't support cascaded indexing. You could either split the computation into two lines like you've done (and which I recommend!); or write a function that takes in a(b) and d and does the indexing. Either way, MATLAB has to create the intermediate vector so you're not gaining anything but you would be masking the computation with the latter.
f = foo(a(b), d)
4 Comments
Sean de Wolski
on 20 Mar 2015
I think you're data storage scheme here is what's making it difficult, see this:
If you use a standard array, or cell array, you could use those two-three lines in a loop, looping over columns of the array and the total will be about 6 lines long.
Do you have a minimal working example with random vectors and say 2-3 of them?
More Answers (0)
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!