"Steven_Lord" <firstname.lastname@example.org> wrote in message > > Not only will this be slow, it will also error. If you have a 10 row array: > > xv = (1:10).'; > X = [xv, xv.^2] > size(X) > > and you delete one row, you now have a 9 row array: > > X(3, :) =  > size(X) > > In your code, length(dati) is NOT evaluated each time the loop body executes > but is fixed when the loop STARTS executing. Thus you'd walk off the end of > the array if any of the rows are deleted. > > So you want to eliminate rows whose sum is less than 355 and whose maximum > and minimum elements are more than 20 apart? Use logical indexing on the > whole array at once rather than row-by-row. Compute along the rows by > specifying a dimension input argument to SUM and RANGE. > > rowsums = sum(dati, 2, 'double'); > rowranges = range(dati, 2); > dati(rowsums < 355 & rowranges > 20, :) = ; > > While you could do this all on one line, I broke the two conditions out so > you could experiment with a smaller dati to prove to yourself that it works > and that you understand what the code is doing. > > -- > Steve Lord > email@example.com > To contact Technical Support use the Contact Us link on > http://www.mathworks.com
Yes, thank you, your comment is right, I replaced the for loop with a while one like:
while (a>0) if((sum(dati(i,:))<355) & range(dati(i,:))>20) a = a - 1; dati(i,:) = ; end end
I'll try evaluate it with logical indexing as you suggested. Copy the array in an other one take about 1,5 hrs every 1000000 iterations so the whole operation is exstimated in about 300 hrs or 12,5 days (too much, conditions change meanwhile).