Serhiy Kapustyan
Serhiy Kapustyan

Reputation: 19

Matlab delete specific elements from an array

I have for example a=[1 2 3 4 5 6 7 8 9 10]; and I have to delete each 2 following numbers from 3.
like at the end it should be a=[1 4 7 10];
How to do this without a for loop.

And also if there is a way to guarantee that at the end the resulting array will have exact number of entries, like here it should be a with 4 entries at the end.

But for example we have b=[1 2 3 4 5 6 7 8 9 ]; and if I want make sure that at the end I still have 4 entries in the rest array, so that b can't be equal to [1 4 7] because I need 4 entries for sure.

Upvotes: 0

Views: 2624

Answers (3)

EBH
EBH

Reputation: 10440

This code speaks for itself:

a = 1:15; % some vector
% returns every third element after the first one:
third_elemets = a(1:3:end);
% returns the missing elements for the vector to be in size 4 from the end of a
last_elements = a(end-3+length(third_elemets):end);
% take maximum 4 elements from a
logic_ind = true(min(4,length(third_elemets)),1);
% and concatanate them with last_elements (if there are any)
a = [third_elemets(logic_ind) last_elements]

and under the assumption that whenever there are less than 4 elements you simply take the last one(s) - it should always work.

Upvotes: 0

Sardar Usama
Sardar Usama

Reputation: 19689

As you mentioned in the question and in the comments that you need 4 elements at the end and if elements are less than 4 then you want to include the last element/s of b, the following should work:-

b=[1 2 3 4 5 6 7 8 9] 

b_req=b(1:3:end);
temp=length(b_req);
if temp<4  b_req(end+1:4)=b(end-3+temp:end);    % for including the elements of b so that total elements are 4 at the end
elseif temp>4 b_req=b_req(1:4);                 % for removing the extra elements
end
b_req

Output:-

b = 
     1     2     3     4     5     6     7     8     9

b_req =
     1     4     7     9


and if instead b=[1 2 3 4 5 6 7 8 9 10]; then the same code gives what you require, i.e.
b_req = [1 4 7 10]

Upvotes: 0

LowPolyCorgi
LowPolyCorgi

Reputation: 5170

You can use indexing for this:

A = 1:10;
B = A(1:3:end)
B =
    [1 4 7 10]

Or, if you really want to remove elements:

A = 1:10;
A(2:3:end) = [];
A(3:3:end) = [];

For your second question regarding length checking, it's unclear what you're asking. Would an if comparison be enough ?

if numel(A) ~= 4

    % ... Handle unexpected values here

end

Best,

Upvotes: 2

Related Questions