[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: How do I replace this for-loop?
From: |
Ben Abbott |
Subject: |
Re: How do I replace this for-loop? |
Date: |
Sat, 05 Jul 2008 19:33:48 -0700 |
On Saturday, July 05, 2008, at 03:20PM, "Martin Weiser" <address@hidden> wrote:
>On Sat, 5 Jul 2008, Martin Weiser wrote:
>
>> On Fri, 4 Jul 2008, Robert Macy wrote:
>>
>>> What's the best way to replace this for-loop?
>>>
>>> Given an array, n, of datapoints, such that:
>>>
>>>>> size(n)
>>> rows = 27000
>>> columns = 2
>>>
>>> where n(:,1) are all the integer x values, and
>>> n(:,2) are all the integer y values,
>>> both integer values are in the range of 1 to 101
>>>
>>> I slowly did it this way:
>>>
>>> output=zeros(101,101);
>>> for i=1:27000
>>> output( n(i,1),n(i,2) ) = output( n(i,1),n(i,2) ) + 1;
>>> endfor
>>>
>>> as you all know this is fairly slow.
>>> What's a simple way to replace this for-loop?
>>>
>>> Robert
>>>
>> Hi,
>> what about something like:
>> ni=zeros(27000,1);
>> ni=sub2ind(size(n),n(:,1),n(:,2));
>> ni=sort(ni);
>> [breaks,garbage,indeces]=find(ni-shift(ni,1);
>> times=breaks-shift(breaks,1);
>> output=zeros(101,101);
>> output(indeces)=times;
>>
>> (I would guess that people here will come with something much more
>> straightforward and elegant, maybe with an one-liner.)
>> I have not tested that, but HTH
>> Martin W.
>
>Hello,
>I am sorry, I have realized now that I was almost completely wrong.
>Sorry again,
>Martin W.
Martin,
Actually, you weren't so far off. Your attempt gave me the inspiration needed
to produce the result below. For testing purposes, I created a random version
for "n".
N = 27000;
M = 101;
output = zeros (M, M);
n = round ((M-1) * rand([N, 2])) + 1;
ni = sub2ind (size (output), n(:,1), n(:,2));
ni = sort (ni);
ni = [ni; max(ni)+1];
fdni = find (diff (ni));
num = diff ([0;fdni]);
mi = ni(fdni);
output(mi) = num;
Robert, As I am a 3.0.1/3.0.0+ user, I have no idea if this will work for
Octave 2.1.50a.
Ben