
Re: very large array
Posted:
Jun 24, 2013 11:11 AM


"Lorenzo Quadri" <quadrilo_sub_r@gmail.com> wrote in message <kq9n1f$smu$1@newscl01ah.mathworks.com>... > "Steven_Lord" <slord@mathworks.com> 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 rowbyrow. 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 > > slord@mathworks.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: > > a=length(dati) > > 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). > > > thank you very much
ops sorry
while (a>0) if((sum(dati(i,:))<355) & range(dati(i,:))>20) dati(i,:) = []; end a = a  1; end

