[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Recursion / global variables trouble
From: |
John W. Eaton |
Subject: |
Recursion / global variables trouble |
Date: |
Fri, 25 Jan 2002 03:56:32 -0600 |
On 25-Jan-2002, Pieter Thysebaert <address@hidden> wrote:
| Hello,
|
| I'm new to this mailing list, but I've already got some questions ;-)
|
| The version of octave I'm using is
| GNU Octave, version 2.0.16 (i386-pc-linux-gnu)
| on Debian GNU/Linux 2.2
|
| I needed to plot a function which is defined as N-1 nested sums (over the
| variables x1,...,x(N-1) say).
| These values do not range over some interval independently of one another,
| but their sum must equal a certain fixed number, say Q (so there are N
| variables, but the last one can be calculated from the first N-1 vars)
|
| So x1 ranges from 0 to Q, for every x1 value, x2 ranges from 0 to Q-x1, ....
|
| However, N is a parameter and I would like to be able to plot this function
| for different values of N.
|
| The approach I came up with is to use a global vector of elements, to be used
| to store the actual values of the iteration variables in some iteration.
|
| Specifically, what I wrote looks like:
|
| function res=calc_term_in_function_of_iteration_vars(z)
| global iterationvars;
| % calculate useful things and store into res
| endfunction
|
| function r=forloop(z,depth)
| global iterationvars; %vector that holds the variable values
| global N;
| global Q;
|
| if (depth==N)
| r = calc_term_in_function_of_iteration_vars(z);
| else
| for iterationvars(depth)=0:Q-sum(iterationvars(1:depth-1))
| %for x1, where depth = 1, sum(iterationvars(1:0)) will return 0=OK
| %DEBUG printf
| printf("Value of x%d is %d\n\r",depth,iterationvars(depth));
| r = r+forloop(z,depth+1);
| endfor
| endif
| endfunction
|
| To evaluate the function in a point z, I call forloop(z,1) (after having
| initialized the needed global variables as global)
|
| As you can guess from where I inserted the printf, things don't work like I
| expected them to do:
| I have tried it with N=2 and Q=2, and then for each iteration at depth 1
| (there are three terms : x1 = 0,1,2=Q) I get
| Value of x1 = 0
|
| So somehow iterationvars(depth) is not adjusted properly (in the for...line)
| Can anybody help me with this parameter passing /global variable issue ?
I'm not sure I follow what you're trying to do, but it seems to me
that there is a bug in Octave 2.0.x that prevents code like
for x(i) = 1:n
from working correctly, though it seems to work in the current
development version (2.1.35):
2.0.16:
octave:4> x = ones (1,3); i = 3; n = 5; for x(i) = 1:5 x(i) end
ans = 1
ans = 1
ans = 1
ans = 1
ans = 1
octave:5> x
x =
1 1 1
2.1.35 (this is the behavior I would expect):
octave2.1:1> x = ones (1,3); i = 3; n = 5; for x(i) = 1:5 x(i) end
ans = 1
ans = 2
ans = 3
ans = 4
ans = 5
octave2.1:2> x
x =
1 1 5
I suppose a workaround would be to write
for tmp = 1:n
x(i) = tmp;
...
If this isn't the problem, then can you please post a complete working
example that demonstrates the problem?
Thanks,
jwe
-------------------------------------------------------------
Octave is freely available under the terms of the GNU GPL.
Octave's home on the web: http://www.octave.org
How to fund new projects: http://www.octave.org/funding.html
Subscription information: http://www.octave.org/archive.html
-------------------------------------------------------------