Delete every n rows if less than x

2 vues (au cours des 30 derniers jours)
David du Preez
David du Preez le 2 Juin 2017
Hi I have a m x 14 matrix. I want to consider the first 24 rows. If the value in coulmn 5 in row 14 is less than x, then delete the first 24 rows. I want to repeat this for the rest of the matrix as well, considering 24 rows at a time
  4 commentaires
Jan
Jan le 2 Juin 2017
@David: Please give us any useful details. Did you read the "Getting Started" chapters of the documentation already? Did you see Matlab's Onramp tutorials? Is m a multiple of 24? Do you know how to create a FOR loop?
David du Preez
David du Preez le 2 Juin 2017
@Jan: Yes m is a multiple of 24. The matrix contains hourly values. Column 1 contains datenum values. Therefore row 14 column 5 will be the daily 13:00 value. Will have a look at the tutorial now

Connectez-vous pour commenter.

Réponse acceptée

Jan
Jan le 2 Juin 2017
Modifié(e) : Jan le 2 Juin 2017
Assuming that m is a multiple of 24:
DataM = reshape(Data, 24, [], 14);
Match = (DataM(14, :, 5) >= x);
Result = reshape(DataM(:, Match, :), [], 14);
For teaching with a FOR loop:
Keep = true(1, size(Data, 1));
for k = 1:24:size(Data, 1)
Keep(k:k+23) = (Data(k+4, 14) >= x);
end
Result = Data(Keep, :);

Plus de réponses (2)

Andrei Bobrov
Andrei Bobrov le 2 Juin 2017
Let A - your array [m x 14]
ii = ceil((1:m)'/24);
l0 = accumarray(ii,A(:,5) >= x,[],@all);
out = A(l0(ii),:);

Anushi1998
Anushi1998 le 2 Juin 2017
Consider going from the end because this won't run your loop infinitely when the portion is not deleted.
Since we have to consider only segments of size 24*14 it won't affect whether we go from top to bottom or bottom to top.
a=%array of size m * 14
for ii=m:-24:24
b=a(ii-23:ii,:);
if(b(14,5)<x)
a(ii-23:ii,:)=[];
end
end

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by