Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

I need to remove every other 9 rows of a matrix

Asked by Joseph on 25 Jun 2013

This should be simple but its giving me some trouble. I have a matrix of 57 rows and 3 columns. This matrix is a condensed set of data from 3 data sets with 19 rows of data each. The first 9 rows of each individual data sets are unneeded and need to be removed. So in the full matrix I need to remove the first 9 rows of data, move down 10 rows, remove the next 9 rows of data, move down another 10 rows, and the remove the next 9 rows of data. Does anyone know how I can do this?

0 Comments

Joseph

Products

4 Answers

Answer by Matt Eicholtz on 27 Jun 2013
Accepted answer

How about this?

r = 57; % total rows
c = 3;  % total columns
d = 19; % rows in each data set 
n = 9;  % remove first n rows in each data set
A = cumsum(ones(r,c)); % example data
A(mod(1:r,d)<=n & mod(1:r,d)>0,:) = [];

1 Comment

Joseph on 29 Jun 2013

Great, I can easily modify this for any data size. Thank you. Thanks to everybody for their help.

Matt Eicholtz
Answer by Andrei Bobrov on 26 Jun 2013
Edited by Andrei Bobrov on 27 Jun 2013
A  = randi(100,57,5); % your data
a = 19*ones(size(A,1)/19,1);
A(bsxfun(@plus,cumsum(a) - a + 1,0:8),:) = [];

2 Comments

Joseph on 26 Jun 2013

Thank you for your help. This works great for my data set of 57 rows but what if I had an increased data size.So for example say I had a data set of 190 rows or even more. How would I change this to accommodate for additional data? I attempted to run the code for a 190 row set and it didn't quite work.

Andrei Bobrov on 27 Jun 2013

corrected

Andrei Bobrov
Answer by Jan Simon on 26 Jun 2013
A  = rand(57,5);
s1 = size(A, 1);
index           = zeros(1, s1);
index(1:19:s1)  = 1;
index(10:19:s1) = -1;
R = A(logical(cumsum(index)), :);

(not tested)

0 Comments

Jan Simon
Answer by Matt Kindig on 26 Jun 2013
Edited by Matt Kindig on 26 Jun 2013

So, to confirm, you need to do the following:

  • remove rows 1-9 (9 rows)
  • retain rows 10-19 (10 rows)
  • remove rows 20-28 (9 rows)
  • retain rows 29-38 (10 rows)
  • remove rows 39-47 (9 rows)
  • retain rows 48-57 (10 rows)

I think this should do it:

M = [(1:57)', rand(57,2)];  %random data for illustration
npts = size(M,1);
nremove = 9;   %number of rows to remove at once
nretain = 10;  %number of rows to retain at once
%which removes to remove
removeRows = cell2mat(arrayfun(@(k) k:(k+nremove-1), 1:(nremove+nretain):npts, 'UniformOutput', false));
removeRows(removeRows>npts)=[];  %ignore rows beyond size of M
M(removeRows,:) = [];  %remove these rows

0 Comments

Matt Kindig

Contact us