Convert from mathematica to matlab

In summary: Hello,thanks for replying.I don't understand what you mean.I am doing the sum of the squares.I calculate:LastPoint1D=@(n) findend(Walk1D(n));and then:MeanSquareDistance1D= @ (n,m) m*sum((LastPoint1D(n)).^2)./m;When i write :sum(steps(n).^2)what does it mean?EDIT-->> sum(steps(n).^2) means "square every element of steps(n), then add them all up".sum(steps(n))^2 means "add up all the elements of steps(n), then
  • #1
ggeo1
63
0
Hello ,i have the following problem in mathematica and want to do it in matlab.

mathematica :
Code:
...
Walk1D[n_] :=  FoldList[Plus, 0, steps[n]]
LastPoint1D[n_] := Fold[Plus, 0, steps[n]]
...
nsteps = 200; nsq = Floor[Sqrt[nsteps]];
MeanSquareDistance1D[n_Integer, m_Integer] := 
    N[Sum[LastPoint1D[n]^2, {m}]/m]
r2D=MeanSquareDistance1D[100, 1000]

data = Map[({#, MeanSquareDistance1D[#,2000]})&,
          Range[10, 90, 20]]

And i did this :
Code:
Walk1D =@ (n) cumsum(steps(n));
LastPoint1D_old=@ (n) cumsum(steps(n));
LastPoint1D=@ (n) LastPoint1D(end);
nsteps=200;
nsq=floor(sqrt(nsteps));
MeanSquareDistance1D= @ (n,m) m*sum(LastPoint1D(n).^2)/.m;
r2D=MeanSquareDistance1D(100,1000)

I have two problems:
1) The result from r2D is always "1" but it must change values.
2) I can't handle the "data" with Map function in mathematica.I now i must do an arrayfun(f,x) and x=10:20:90 but i am confused how to type it.
 
Physics news on Phys.org
  • #2
For
Code:
data = Map[({#, MeanSquareDistance1D[#,2000]})&,
          Range[10, 90, 20]]

i am doing this :
Code:
for i=10:20:90
    data=arrayfun(MeanSquareDistance1D(i,2000),i)
end

but it gives me: Error using ==> arrayfun
First input must be a function handle.

Of course,it is a function handle as i declared it above.(The r2D value keep remaining the same!)
 
  • #3
Anyone , a little help??
 
  • #4
I think you're not getting responses because very few people are experts in both Mathematica and Matlab. I know almost nothing about Mathematica. For example, I don't really know what Sum[LastPoint1D[n]^2, {m}] means. What's {m} for? It would be easier if you just explained mathematically what you are trying to do.

On the Matlab side, your definition “LastPoint1D=@ (n) LastPoint1D(end)” makes no sense at all. You are defining a function that is itself? On top of that, the argument n is ignored completely. some_matrix(end) simply returns the last element in the matrix, so LastPoint1D(1) would be the same as LastPoint1D(23546).

Also, in "m*sum(LastPoint1D(n).^2)/.m", “/.” is not an appropriate operator (unless this is some new feature in Matlab I don't know about). Do you mean “./”?

You probably don't need arrayfun. You just need to write your script the Matlab way. Matlab let's you index matrices with vectors and calculate everything at once. No need for any loops.
 
  • #5
Hello,this is my new code :

Code:
steps=@ (m) randi(3,1,m)-2;

Walk1D =@ (n) cumsum(steps(n));
findend=@ (x) x(end);
LastPoint1D=@(n) findend(Walk1D(n));


nsteps=200;
nsq=floor(sqrt(nsteps));
MeanSquareDistance1D= @ (n,m) m*sum((LastPoint1D(n)).^2)./m;
r2D=MeanSquareDistance1D(100,1000)


data=zeros(5,2);
for i=10:20:90
 data(i,:)=[i,MeanSquareDistance1D(i,2000)]
end

The problems are:
1) The r2D gives me very small numbers(10^-2 - 10^-3) but in original code(mathematica)gives 10-100.
2)I want a different way to fill "data" because i want data to be a 5x2 matrix and display it.
3) If i plot(data) ,it gives me the right graph but also with a line of points onto the x-axis.If i try plot(data(:,1),data(:,2)) it gives me wrong graph.


The LastPoint[n] defines the last position.
The mean square distance defined as the mean value in a collection from m different orbits of n steps,for each one of them computes the square of the distance between its beginning and end and then is computed the mean value.


EDIT-->> For the small values ,the problem was that i didn't multiply with m>The correct is "MeanSquareDistance1D= @ (n,m) m*sum((LastPoint1D(n)).^2)./m;"
The other problems still exist.
 
Last edited:
  • #6
One odd thing: LastPoint1D(n) always returns a number, so m*sum((LastPoint1D(n)).^2)./m is equal to LastPoint1D(n)^2 and m has no effect at all.
3) If i plot(data) ,it gives me the right graph but also with a line of points onto the x-axis.If i try plot(data(:,1),data(:,2)) it gives me wrong graph.
In your for loop, when you write: data(i,:)=[i,MeanSquareDistance1D(i,2000)], i is 10, 30, 50..., so you are telling Matlab: data(10, :)=..., data(30, :)=..., and Matlab expands the matrix. In the end, you have a 90x2 matrix with only a few rows filled with values, the rest are zeros.

Do it like this:
Code:
data=[];
for i=10:20:90
  data=[data; i MeanSquareDistance1D(i,2000)];
end

Then plot(data(:, 1), data(:, 2)).
 
  • #7
Hello, m has an effect because if i don' put it for example,i take very small numbers.I think that part its ok.
With the code you gave me ,the filling of the "data" it's ok but we have a problem!
It supposes to give me sth like:
10, 10.184
30, 27.51
50, 50.306
70, 68.394
90, 90.414

The 2nd column must give approximately the numbers of the 1st column in order to plot a straight line.But with my code it gives me for example:

data =

10 0
30 9
50 49
70 9
90 100

Somewhere ,sth is wrong but i can't figure...
Thanks for helping.

EDIT--->>
I am correcting to:
steps=@ (m) 2*randi([0,1],[1,m])-1; -->it must give me (-1,1)
but still the problem with "data" 2nd column.
 
Last edited:
  • #8
I think i tracked the problem but i can't express it.It has to do with what you said.
I want the Walk1D and the LastPoint1D to begin always with zero!
For example,as many times as i execute the code,the Walk1D[10] must give me:
{0, -1, 0, 1, 2, 1, 2, 3, 4, 3, 4}
{0, 1, 2, 1, 2, 1, 0, 1, 0, -1, -2} and so on.

But ,in my code this doesn;t happen.

I have: Walk1D =@ (n) cumsum(steps(n));
I don't know how to do it.If i try "Walk1D =@ (n) cumsum(0:steps(n));"
it doesn't work..

EDIT-->> I did this :Walk1D =@ (n) [0,cumsum(steps(n))]; but i don't know if its right(it didn't fixed the problem though)
 
Last edited:
  • #9
I think your main problem is that you are calculating the square of the sum, instead of calculating the sum of the squares.
 
  • #10
I think i am doing it right.??

m*sum((LastPoint1D(n)).^2)
 
  • #11
LastPoint1D(n) is already the sum of the steps. It's a number, so summing it does nothing. The last element of cumsum is the total sum. What you are really calculating is sum(steps(n))^2. You need to calculate sum(steps(n).^2).
 
  • #12
Ok, i unsterstood what you say.But ,i thought every time i call LastPoint(n) it calls Walk1D which is calls steps.That way LastPoint(n) won't be only a number.

I tried the " sum(steps(n).^2" but now it gives me exactly :
10
30
50
70
90

It should give me approximately the above numbers ,as i said before.
We are so close!
Any idea?
And thanks!
 
  • #13
The mean square distance defined as the mean value in a collection from m different orbits of n steps,for each one of them computes the square of the distance between its beginning and end and then is computed the mean value.
After re-reading this, I sort of understand what you are trying to do. The problem with the code is that you are not really doing the “compute the mean value in a collection of m orbits” part. Your code is essentially setting m=1. That's why m did not have any effect.

Based on your definition, the correct Matlab code is:

Code:
steps=@ (n, m) randi([-1 1], n, m);
LastPoint1D=@ (n, m) sum(steps(n, m));
MeanSquareDistance1D= @  (n,m) mean(LastPoint1D(n, m).^2);

steps returns a 2D matrix (rows=n steps, columns=m orbits). When it is summed to get the difference between start and end position, it becomes a vector (columns=m orbits) which can then be squared and averaged.

The value returned by MeanSquareDistance1D(n, m) is around n/2, but that's easy to understand if you think about the random distribution.

If you want to calculate Walk1D first, index the result of cumsum using (end, :) to get LastPoint1D as the last point of each column.
 
Last edited:
  • #14
Hello!Finally it worked!Thank you very much for your effort.
I left the code as it was but i added :

steps1=@ (n, m) randi([-1 1], n, m);
LastPoint_1D=@ (n, m) sum(steps1(n, m));
MeanSquareDistance1D = @(n,m) mean(LastPoint_1D(n,m).^2);

The only <<problem>> (as you said (n/2)) is that the values i am taking are too small,for example:
data =

10.0000 6.9790
30.0000 20.7105
50.0000 33.2900
70.0000 44.5420
90.0000 57.0020

The graph still is straight but with smaller slope.
 
  • #15
I am trying to do now :
Code:
nsteps=10:20:90;
pol=polyfit(nsteps,data,1)

or

Code:
nsteps=10:20:90;
pol=polyfit(nsteps,data(:,2),1)

but it gives me

Error using ==> polyfit at 48
X and Y vectors must be the same size.

Error in ==> randomwalk1d at 55
pol=polyfit(nsteps,data,1)

but nsteps and data(:,2) are the same size!

If you could tell what to do..

EDIT -->> I found it
I wrote :
pol=polyfit(nsteps,data(:,2)',1)
 
Last edited:

What is the difference between Mathematica and Matlab?

Mathematica and Matlab are both powerful programming languages used for mathematical and scientific computations. However, there are some key differences between the two. Mathematica is a symbolic language, meaning it manipulates mathematical expressions in their exact form, while Matlab is a numerical language, meaning it approximates mathematical expressions using algorithms. Additionally, Mathematica has a built-in library of functions and algorithms, while Matlab requires the use of specialized toolboxes for certain computations.

Can I directly convert a Mathematica code to Matlab?

No, there is no direct conversion between Mathematica and Matlab. However, there are tools and methods available to help with the conversion process, such as using the "Export" function in Mathematica to save the code in a format that can be read by Matlab. Some manual adjustments may also be necessary due to differences in syntax and available functions between the two languages.

Which language is better for scientific computations?

Both Mathematica and Matlab are widely used in the scientific community for their computational capabilities. The choice between the two ultimately depends on the specific needs and preferences of the user. Mathematica may be more useful for symbolic computations and data visualization, while Matlab may be better for numerical analysis and programming complex algorithms.

Do I need to have knowledge of both Mathematica and Matlab to convert between them?

Having knowledge of both languages can certainly make the conversion process easier, but it is not necessary. As mentioned earlier, there are tools and resources available to aid in the conversion process. However, having a basic understanding of the differences between the two languages can also be helpful in identifying any potential issues during the conversion.

Are there any limitations or challenges in converting from Mathematica to Matlab?

There may be some limitations or challenges in converting from Mathematica to Matlab, as the two languages have different syntax and capabilities. For example, some functions or algorithms may not have a direct equivalent in the other language, requiring manual adjustments or the use of different methods. Additionally, some data structures may also need to be converted to be compatible with the target language. It is important to thoroughly test the converted code to ensure it functions as intended.

Back
Top