set indexing( i+1) as a variable

  • Follow


I am having a problem. Say every time cl2 is greater than cl1 I want to know what 
cl1(i+1) is. This worked just like I thought it would. I did it below.

cl1=[5;10;15;20;25;30]
cl2=[6;11;14;21;24;31]
 for i = 1:length(cl1)-1
     if cl2(i)>cl1(i)
         B=cl1(i+1)
     end
 end

the output was B=10, B=15,B=25
My problem is that I would like to make the i+1 part of my code a variable, so I could change that part to be ( i+1) or (i+2) or just (i) or just about anything that works.  So I tried to make the (i+1) part a variable but it does not seem to work.  Below I made ii a variable and put it in the code where B=cl1(ii)

ii=i+1
 cl1=[5;10;15;20;25;30]
 cl2=[6;11;14;21;24;31]
 for i = 1:length(cl1)-1
     if cl2(i)>cl1(i)
         B=cl1(ii)
     end
 end
??? Subscript indices must either be real positive integers or logicals.
Error in ==> manipVect at 41
         B=cl1(ii)
This error message makes it seem like my indexing is wrong, but I know it worked before I tried to make ( i+1 )   into a variable so I think the way I am making i+1 into a variable is wrong. Could you tell me the right way to turn an index into a variable?
Thank you,
0
Reply jonathan 8/30/2010 11:20:11 PM

On 10-08-30 06:20 PM, jonathan wrote:
> I am having a problem. Say every time cl2 is greater than cl1 I want to
> know what cl1(i+1) is. This worked just like I thought it would. I did
> it below.
>
> cl1=[5;10;15;20;25;30]
> cl2=[6;11;14;21;24;31]
> for i = 1:length(cl1)-1
> if cl2(i)>cl1(i)
> B=cl1(i+1)
> end
> end
>
> the output was B=10, B=15,B=25
> My problem is that I would like to make the i+1 part of my code a
> variable, so I could change that part to be ( i+1) or (i+2) or just (i)
> or just about anything that works.

ii=1;
cl1=[5;10;15;20;25;30]
cl2=[6;11;14;21;24;31]
for i = 1:length(cl1)-ii
     if cl2(i)>cl1(i)
         B=cl1(i+ii)
     end
end


Alternately the whole thing can be vectorized:

offset=1;
B = cl1(find(cl2(1:end-offset)>cl1(1:end-offset))+offset)
0
Reply Walter 8/30/2010 11:27:16 PM


Walter Roberson <roberson@hushmail.com> wrote in message <i5her4$lgm$1@canopus.cc.umanitoba.ca>...
> On 10-08-30 06:20 PM, jonathan wrote:
> > I am having a problem. Say every time cl2 is greater than cl1 I want to
> > know what cl1(i+1) is. This worked just like I thought it would. I did
> > it below.
> >
> > cl1=[5;10;15;20;25;30]
> > cl2=[6;11;14;21;24;31]
> > for i = 1:length(cl1)-1
> > if cl2(i)>cl1(i)
> > B=cl1(i+1)
> > end
> > end
> >
> > the output was B=10, B=15,B=25
> > My problem is that I would like to make the i+1 part of my code a
> > variable, so I could change that part to be ( i+1) or (i+2) or just (i)
> > or just about anything that works.
> 
> ii=1;
> cl1=[5;10;15;20;25;30]
> cl2=[6;11;14;21;24;31]
> for i = 1:length(cl1)-ii
>      if cl2(i)>cl1(i)
>          B=cl1(i+ii)
>      end
> end
> 
> 
> Alternately the whole thing can be vectorized:
> 
> offset=1;
> B = cl1(find(cl2(1:end-offset)>cl1(1:end-offset))+offset)

Mr. Roberson, that is incredible how quickly you did that, and yes it works,Thanks.
 I would really like to know  if i could make the index into a varialbe, like i tried to do in my example above?  It would help to know because the real problem i have is on a much larger for loop then the example i made to show you.

can i make i+1 into a varialbe , like  ii=(i+1)  and then attach that variable to a vector named  A like:   A(ii)   , where we know ii=(i+1)?

thanks
0
Reply jonathan 8/30/2010 11:48:06 PM

On 10-08-30 06:48 PM, jonathan wrote:

> I would really like to know if i could make the index into a varialbe,
> like i tried to do in my example above? It would help to know because
> the real problem i have is on a much larger for loop then the example i
> made to show you.
>
> can i make i+1 into a varialbe , like ii=(i+1) and then attach that
> variable to a vector named A like: A(ii) , where we know ii=(i+1)?

Where you write "ii=(i+1)" you are not really trying to define a variable: 
instead you are trying to define a formula, a rule that transforms "i" in to a 
(usually) different value.

You have two major possibilities: you can define a function to do the 
transformation, or you can work symbolically.

Routine example of using a function:

ii = @(x) x + 1;

This defines "ii" as being a function handle for a function that takes a 
single parameter whose name of convenience is "x" and returning one more than 
the value of that parameter.

Then later, you would use it as,

A(ii(i))

This use standard function call syntax to invoke the function ii with a 
parameter which is the current value of i.

Advanced example of using a function:

Save the following in incrtest.m -- do not attempt this from the command line.

function incrtest
   offset = 1        %MUST be initialized before the below "function"
   i = 5              %MUST be assigned a value before the following line
   function P = ii    %define a nested function. MUST be in the same function
     P = i + offset;
   end                %the "end" is mandatory here
   A(ii) = 9
   i = 2
   A(ii) = 4
   offset = 2
   A(ii) = 7
end                  %this "end" statement is mandatory!!


Now invoke incrtest and study the outputs.

This advanced example uses nested functions and closures, considerably more 
advanced techniques -- but it allows you to write the remaining code in the 
style you were hoping for.


Symbolically, you would use

offset = 1
sym i;            %this gives a value to the variable named "i"
ii = i + offset;  %this gives a symbolic expression to the variable named "ii"

Then later you would use, e.g.

A = 1:5
for i = 1 : 3    %this for loop assigns a new value to "i"
   A(subs(ii))    %this evaluates the symbolic expression stored in ii,
                  %replacing the symbolic variable i that is inside it
                  %with the current numeric value of i
end


Although this method is the closest in spirit to the way you originally wrote 
the code, you can see that it is in some ways the clumsiest of the methods. Oh 
yes, and it also depends upon you having a license for the symbolic toolkit, 
which is included in the student edition but is an extra-cost for all the 
other license forms. Also, statements that use the symbolic toolkit cannot be 
compiled by the Matlab Compiler toolkit.


The mechanism that allows you to write the code in the loop most closely to 
how you wanted is the most advanced technique and hence the most likely to 
make a mistake with. The mechanism that allows you to write the rule most 
closely to how you wanted is clumsy to use in practice (and easy to make 
mistakes with.)

0
Reply Walter 8/31/2010 1:43:46 AM

Thanks Mr. Roberson, I am working on the function approach.
0
Reply jonathan 8/31/2010 3:17:24 AM

4 Replies
260 Views

(page loaded in 0.552 seconds)


Reply: