From help-octave-request at bevo dot che dot wisc dot edu Fri Jan 25 03:57:13 2002 Subject: Recursion / global variables trouble From: "John W. Eaton" To: Pieter Thysebaert Cc: help-octave at bevo dot che dot wisc dot edu Date: Fri, 25 Jan 2002 03:56:32 -0600 On 25-Jan-2002, Pieter Thysebaert 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 -------------------------------------------------------------