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?

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,:) = [];

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),:) = [];

Joseph
on 26 Jun 2013

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)

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

Opportunities for recent engineering grads.

## 0 Comments