Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Thread Subject:
vectorizing if loop

Subject: vectorizing if loop

From: Jonathan

Date: 23 Mar, 2010 18:37:23

Message: 1 of 6

G'day,

I have the following matrix...

Beta = [52 52 52 52 60 52 40 24 32 44];
yB = zeros(1,length(Beta)).';
for i = 1:length(Beta)
    if Beta>0 & Beta<10
        yB(i)=1;
    elseif Beta>10 & Beta<63
        yB(i)=cos((Beta-10)*pi()/180);
    elseif Beta>63
        yB(i)=0.63;
    end
end

For starters, the if loop doesn't do anything (other than creating the initial matrix) and it is not clear to me why. I guess one approach to vectorizing the code is to eliminate the first and third if statements and use the find function instead. However, is there also something wrong with the second if statement?

Thanks for any help on this.
Jon

Subject: vectorizing if loop

From: dpb

Date: 23 Mar, 2010 18:54:54

Message: 2 of 6

Jonathan wrote:
> G'day,
>
> I have the following matrix...
>
> Beta = [52 52 52 52 60 52 40 24 32 44];
> yB = zeros(1,length(Beta)).';
> for i = 1:length(Beta)
> if Beta>0 & Beta<10
> yB(i)=1;
> elseif Beta>10 & Beta<63
> yB(i)=cos((Beta-10)*pi()/180);
> elseif Beta>63
> yB(i)=0.63;
> end
> end
>
> For starters, the if loop doesn't do anything (other than creating the
> initial matrix) and it is not clear to me why. I guess one approach to
> vectorizing the code is to eliminate the first and third if statements
> and use the find function instead. However, is there also something
> wrong with the second if statement?

Well, there is no such thing as an "if loop" for starters. If you
really meant that as written that may be your conceptual problem.

The if statement(s) _DO_ do, something, just not what you (apparently)
think.

Type

doc if

for details of what, precisely.

 > yB = zeros(1,length(Beta)).';

yB = zeros(length(Beta),1);
for i = 1:length(Beta)
   if Beta(i)>0 & Beta(i)<10

% and etc., will fix your problem using the for...end

Alternatively, study the following

Beta(Beta>10 & Beta<63) = cos((Beta-10)*pi/180);

and salt to suit...

Also, another way to apply limits is something like

x = max(min(x,MaxVal),MinVal); % Study this, too...

It would be applied before the conversion above altho your sample vector
is all within the limits given.

--

Subject: vectorizing if loop

From: Matt Fig

Date: 23 Mar, 2010 19:03:20

Message: 3 of 6

Look at the value produced by Beta>0. Now how does an IF statement deal with non-scalar arguments? (HINT: read the help for IF)

Beta = [52 52 52 52 60 52 40 24 32 44];
yB = zeros(length(Beta),1);


for ii = 1:length(Beta)
    if Beta(ii)>0 & Beta(ii)<10
        yB(ii)=1;
    elseif Beta(ii)>10 & Beta(ii)<63
        yB(ii)=cos((Beta(ii)-10)*pi/180);
    elseif Beta(ii)>63
        yB(ii)=0.63;
    end
end




Is there a FAQ on this one yet? There should be!

Subject: vectorizing if loop

From: Jan Simon

Date: 23 Mar, 2010 19:18:02

Message: 4 of 6

Dear Jonathan!

> yB(i)=cos((Beta-10)*pi()/180);

BTW. "pi" does not need brackets.

Jan

Subject: vectorizing if loop

From: Bruno Luong

Date: 23 Mar, 2010 19:27:21

Message: 5 of 6

"Jan Simon" <matlab.THIS_YEAR@nMINUSsimon.de> wrote in message <hob45a$8p6$1@fred.mathworks.com>...
> Dear Jonathan!
>
> > yB(i)=cos((Beta-10)*pi()/180);
>
> BTW. "pi" does not need brackets.
>

The bracket should be here: cos((Beta-10)*(pi/180))
so that the vector is scanned one time less when multiplying.

Bruno

Subject: vectorizing if loop

From: Jonathan

Date: 23 Mar, 2010 19:27:21

Message: 6 of 6

Thank you both for your comments. This helped tremendously.

Jon
"Matt Fig" <spamanon@yahoo.com> wrote in message <hob39o$n84$1@fred.mathworks.com>...
> Look at the value produced by Beta>0. Now how does an IF statement deal with non-scalar arguments? (HINT: read the help for IF)
>
> Beta = [52 52 52 52 60 52 40 24 32 44];
> yB = zeros(length(Beta),1);
>
>
> for ii = 1:length(Beta)
> if Beta(ii)>0 & Beta(ii)<10
> yB(ii)=1;
> elseif Beta(ii)>10 & Beta(ii)<63
> yB(ii)=cos((Beta(ii)-10)*pi/180);
> elseif Beta(ii)>63
> yB(ii)=0.63;
> end
> end
>
>
>
>
> Is there a FAQ on this one yet? There should be!

Tags for this Thread

No tags are associated with this thread.

What are tags?

A tag is like a keyword or category label associated with each thread. Tags make it easier for you to find threads of interest.

Anyone can tag a thread. Tags are public and visible to everyone.

Contact us