Search All of the Math Forum:

Views expressed in these public forums are not endorsed by NCTM or The Math Forum.

Notice: We are no longer accepting new posts, but the forums will continue to be readable.

Topic: very large array
Replies: 18   Last Post: Jun 26, 2013 2:53 AM

 Messages: [ Previous | Next ]
 Lorenzo Quadri Posts: 8 Registered: 6/24/13
Re: very large array
Posted: Jun 24, 2013 11:11 AM

> "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 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
> > slord@mathworks.com
> > 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

Date Subject Author
6/24/13 dpb
6/24/13 dpb
6/24/13 dpb
6/24/13 Steven Lord
6/24/13 dpb