Matteo
Matteo

Reputation: 8132

Select all elements except one in a vector

My question is very similar to this one but I can't manage exactly how to apply that answer to my problem.

I am looping through a vector with a variable k and want to select the whole vector except the single value at index k.

Any idea?

for k = 1:length(vector)

   newVector = vector( exluding index k);    <---- what mask should I use? 
   % other operations to do with the newVector

end

Upvotes: 16

Views: 60551

Answers (6)

GaetaWoo
GaetaWoo

Reputation: 371

Another way you can do this which allows you to exclude multiple indices at once (or a single index... basically it's robust to allow either) is:

newVector = oldVector(~ismember(1:end,k))

Works just like setdiff really, but builds a logical mask instead of a list of explicit indices.

Upvotes: 0

chappjc
chappjc

Reputation: 30579

Just for fun, here's an interesting way with setdiff:

vector(setdiff(1:end,k))

What's interesting about this, besides the use of setdiff, you ask? Look at the placement of end. MATLAB's end keyword translates to the last index of vector in this context, even as an argument to a function call rather than directly used with paren (vector's () operator). No need to use numel(vector). Put another way,

>> vector=1:10;
>> k=6;
>> vector(setdiff(1:end,k))
ans =
     1     2     3     4     5     7     8     9    10
>> setdiff(1:end,k)
Error using setdiff (line 81)
Not enough input arguments.

That is not completely obvious IMO, but it can come in handy in many situations, so I thought I would point this out.

Upvotes: 7

ChaoticByNature
ChaoticByNature

Reputation: 411

Another alternative without setdiff() is

vector(1:end ~= k)

Upvotes: 31

Daniel
Daniel

Reputation: 36710

%create a logic vector of same size:
l=ones(size(vector))==1;
l(k)=false;
vector(l);

Upvotes: 2

Luis Mendo
Luis Mendo

Reputation: 112679

Very easy:

newVector = vector([1:k-1 k+1:end]);

This works even if k is the first or last element.

Upvotes: 2

arne.b
arne.b

Reputation: 4330

vector([1:k-1 k+1:end]) will do. Depending on the other operations, there may be a better way to handle this, though.

For completeness, if you want to remove one element, you do not need to go the vector = vector([1:k-1 k+1:end]) route, you can use vector(k)=[];

Upvotes: 10

Related Questions