Cant create a function that return array correctly

Hello,
I'm learning how to use Matlab for some computational physics simulations and i'm having the following problem.
I define a certain quantity
x = [0:dx:L];
y(1,:) = cos(x).*exp(-(x-1*L/2).^2/(2*20));
where the first index of the array represents time and the second (x) represents space.
I want to advance this quantity in time with a simple relation lets suppose, so i create a loop
for n = 1:Nmax
for i = 1:Imax
x(n+1,i) = x(n,i) - 0.5;
end
end
this work just fine..
But now imagine if i want to create a function that advances this quantity x in another .m file and i want to call it here as so
for n = 1:Nmax
x = advancex(n,Imax,x);
end
where the advance function (independent .m file)
function z =advancex(n,Imax,x)
for i = 1:Imax
z(n+1,i) = x-0.5;
end
This way work poorly because only final array is zero in all position in time except for the final position i.e. only z(Nmax,:) is correctly calculated.
How do I do this breakdown correctly in such a way as to end up with an array which has the values of z at every time step n in all positions?
Open to suggestions, thank you so much :)

 Accepted Answer

function z =advancex(n,Imax,x)
for i = 1:Imax
z(n+1,i) = x-0.5;
...only z(Nmax,:) is correctly calculated.
You don't have any thing except one n defined here in the function.
But, you don't really need a function or loops at all --
for n = 1:Nmax
for i = 1:Imax
x(n+1,i) = x(n,i) - 0.5;
end
end
Can be written as simply
x(2:Nmax+1,:)=x(1:Nmax,:)-0.5;
NB that x(1,:) is unchanged from original here and the final size(x,1) is one row larger than the original.

2 Comments

"You don't have any thing except one n defined here in the function."
Within the function your are correct, but since the function is in a loop i'm expecting it to work for every n... Do you agree?
"Can be written as simply
x(2:Nmax+1,:)=x(1:Nmax,:)-0.5;
NB that x(1,:) is unchanged from original here and the final size(x,1) is one row larger than the original."
Great idea, i'll try this. It's just that in my actually program I have to advance these quantities with complicated algorithms and so im trying to create parallel functions to this this to avoid a main code that it to confusing.
Thanks for your help!
It does; but--somewhere you have to allocate x to contain more than the one row n which your code doesn't show how/where you initialize it. When you write
x(n,:) = something;
where x isn't allocated or size(x,1)<n, then Matlab allocates an array of size(n,RHS) or reallocates (extends) to that size. But, any elements in x that have not been preassigned will be zero. I would expect that there is where the rest of the zeros are coming from.
Again I caution you that creating arrays dynamically this way is EXTREMELY expensive in run time performance and is NOT recommended.

Sign in to comment.

More Answers (0)

Asked:

on 18 Jun 2014

Commented:

dpb
on 19 Jun 2014

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!