Path: news.mathworks.com!not-for-mail
From: "Justin " <justinbobo1618@gmail.com>
Newsgroups: comp.soft-sys.matlab
Subject: Re: for loop slows dramatically with successive iterations
Date: Fri, 11 May 2012 21:44:12 +0000 (UTC)
Organization: The MathWorks, Inc.
Lines: 39
Message-ID: <jok17c$lm4$1@newscl01ah.mathworks.com>
References: <jojqje$nc4$1@newscl01ah.mathworks.com> <jojv7t$e5t$1@newscl01ah.mathworks.com>
Reply-To: "Justin " <justinbobo1618@gmail.com>
NNTP-Posting-Host: www-02-blr.mathworks.com
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: newscl01ah.mathworks.com 1336772652 22212 172.30.248.47 (11 May 2012 21:44:12 GMT)
X-Complaints-To: news@mathworks.com
NNTP-Posting-Date: Fri, 11 May 2012 21:44:12 +0000 (UTC)
X-Newsreader: MATLAB Central Newsreader 3483024
Xref: news.mathworks.com comp.soft-sys.matlab:767586

Ah, it all makes sense now. Thanks for pointing out the problem in my code.

Before I read your response, I had an epiphany and I completely rewrote the function and it works beautifully now. Coincidentally, I ended up using pretty similar strategy to your suggestion. I wish I'd asked sooner--in the future, I'm coming straight here for help before I struggle for hours.

Here's my new function, much cleaner than my old one--only 4 lines of code. And I could easily make it 1 line, I just kept it like this for readability.

% convert vector into a matrix
y_reshape = reshape(y_bits,M_repeat,length(y_bits)/M_repeat);
% each column is M_repeat rows and represents the repeated values

y_sum = sum(y_reshape);
% y_sum is now a vector where each element is the sum of the corresponding column of y_reshape

% divide each element by the number of repeats to get an average value
% should be between 0 and 1 inclusive
y_norm = y_sum./M_repeat;

% majority rule means just round the average value to a 0 or 1
z_bits = round(y_norm);

"Roger Stafford" wrote in message <jojv7t$e5t$1@newscl01ah.mathworks.com>...
> "Justin " <justinbobo1618@gmail.com> wrote in message <jojqje$nc4$1@newscl01ah.mathworks.com>...
> >       z_bits(N*M_repeat-(N-1)) = 1;
> - - - - - - - - - -
>   Your problem comes with the line
> 
>  z_bits(N*M_repeat-(N-1)) = 1;
> 
> It should read
> 
>  z_bits((N-1)/M_repeat+1) = 1;
> 
>   As it stands, it skips by 9 each step so that at the end z_bits occupies 9 times as much space as you originally allocated for it.  That should pretty well explain your slow-down.
> 
>   You might consider the following alternative method:
> 
>  z_bits = floor(2*sum(reshape(y_bits,M_repeat,[]),1)/(M_repeat+1));
> 
> Roger Stafford