Index an array using specific indices

32 views (last 30 days)
fadams18
fadams18 on 4 Nov 2022
Answered: fadams18 on 4 Nov 2022
I have a vector
x = [0,1,1,0,1,...,N] % x is vector containing either 1s or 0s of size N = 107199.
then I have another vector s, which contains index locations in x.
s= [23,100,500, 9888,....N] % s is of size 1x518
so I want to filter s to contain only indices where the values in x are 1s.
I tried something like this,
idx = x(s)~=1;
new_s = s(idx);
but it gives me this error Index exceeds the number of array elements (107520).. any idea what im doing wrongly?

Answers (4)

Daniel Neubauer
Daniel Neubauer on 4 Nov 2022
x=[1 0 1 1 0 0 0 0 1 0];
s=[9 4 6];
snew=s(x(s)==1)
snew = 1×2
9 4

DGM
DGM on 4 Nov 2022
Try
% some test vectors
x = randi([0 1],1,20)
x = 1×20
0 0 0 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0
s = randi([1 numel(x)],1,10)
s = 1×10
9 6 20 9 12 9 17 11 7 3
% this is the content selected by s
x(s)
ans = 1×10
1 0 0 1 1 1 1 1 1 0
% and then this would be cases where s selects 1s within x
new_s = s(x(s)==1)
new_s = 1×7
9 9 12 9 17 11 7

dpb
dpb on 4 Nov 2022
Well, if size N = 107199 while s is of size 1x518, then 107199 > 518 so any location in x past numel(s) is going to be an out of bounds reference.
It's not clear in isolation what relationship there is (if any) between x and s so why one would expect those two to be commensurate is puzzling.
Perhaps you're looking for locations that are in s that were found in some other fashion and wanting to know if there's a corresponding matching "1" value in x at the specific location? That's about the only way I can think of at the moment to relate the two -- if that were the case then try
new_s=s(ismember(s,find(~x)));

fadams18
fadams18 on 4 Nov 2022
Ah i got it. In my original code I was doing something to s before the indexing, which was chanching its values. My code also works.
Thanks for your insights and time guys, @KALYAN ACHARJYA @dpb @Daniel Neubauer @DGM.

Community Treasure Hunt

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

Start Hunting!