Translating from Mathematica to Matlab

  • Context: MATLAB 
  • Thread starter Thread starter Frank Einstein
  • Start date Start date
  • Tags Tags
    Mathematica Matlab
Click For Summary

Discussion Overview

The discussion revolves around translating a line of code from Mathematica to Matlab, specifically focusing on the implementation of a mathematical expression involving eigenvalues, eigenvectors, and a vector of random variables. The scope includes technical explanations and coding challenges related to programming in Matlab.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant requests assistance in translating a Mathematica code snippet into Matlab, detailing the components involved: eigenvalues, eigenvectors, and random variables.
  • Another participant suggests decomposing the expression into simpler parts for easier translation and notes a potential syntax error in the original Mathematica code.
  • A participant shares their own attempts at coding in Matlab, expressing frustration with the results and providing their code for generating random variables and calculating a sum.
  • Several participants propose different Matlab code snippets, with one suggesting a structure that uses a loop to sum the results, while another emphasizes the need for element-wise operations in Matlab.
  • There is discussion about the correct interpretation of the Mathematica syntax 'vecs[[j, All]]' and how it translates to Matlab, with suggestions for using either row or column indexing.
  • One participant advises against using for loops in Matlab, recommending vectorized operations instead, and provides an alternative approach to initializing random variables and calculating the sum.

Areas of Agreement / Disagreement

Participants express differing opinions on the best approach to translating the code, with no consensus on a single correct method. There are multiple proposed solutions and ongoing challenges in achieving the desired results.

Contextual Notes

Participants note limitations in their current implementations, such as potential issues with covariance matrix calculations and the need for proper initialization of variables. There is also mention of the importance of understanding the dimensions of matrices and vectors in Matlab.

Frank Einstein
Messages
166
Reaction score
1
Hello everyone.

I was wondering if someone could tell me how to write the next line of Mathematica code in Matlab.
Code:
x = Sum [ Sqrt [ vals[ [ j ] ] ] * vecs [ [ j, All ] ] * z [ [ j ] ] , {j,1,10}
vals is a eigenvalues vector, vecs is a eigenvector matrix and z is a vector of random variables of length 10

Thanks for your answer.
 
Physics news on Phys.org
Why not decompose it into simpler expressions and then convert them yourself?

Also it looks like you might be missing a square bracket or something.

I spaced it out for readability in your post.
 
  • Like
Likes   Reactions: Frank Einstein
jedishrfu said:
Why not decompose it into simpler expressions and then convert them yourself?

Also it looks like you might be missing a square bracket or something.

I spaced it out for readability in your post.

Indeed, I forgot to close the right square bracket.

Believe me. i have tried to do it myself. That code is from a colleague and represents the generation of a random process with a Karhunen Loeve expansion.

My attempts have not given propper results, this is my code:

for i=1:long
z(i)=normrnd(0,1);
f(i)=0;
end for i=1:long%times
for j=1:long%number of terms in the descomposition
f(i)=f(i)+sqrt(eigenvalues2(j))*z(j)*eigenvectors(i,j);
end

end

However, since this hasn't worked, I have tried to do it manually:

% f5(1)=eigenvectors(1,5)*sqrt(eigenvalues(5))*z(5)+eigenvectors(1,4)*sqrt(eigenvalues(4))*z(4)+eigenvectors(1,3)*sqrt(eigenvalues(3))*z(3)+eigenvectors(1,2)*sqrt(eigenvalues(2))*z(2)+eigenvectors(1,1)*sqrt(eigenvalues(1))*z(1);
% f5(2)=eigenvectors(2,5)*sqrt(eigenvalues(5))*z(5)+eigenvectors(2,4)*sqrt(eigenvalues(4))*z(4)+eigenvectors(2,3)*sqrt(eigenvalues(3))*z(3)+eigenvectors(2,2)*sqrt(eigenvalues(2))*z(2)+eigenvectors(2,1)*sqrt(eigenvalues(1))*z(1);
% f5(3)=eigenvectors(3,5)*sqrt(eigenvalues(5))*z(5)+eigenvectors(3,4)*sqrt(eigenvalues(4))*z(4)+eigenvectors(3,3)*sqrt(eigenvalues(3))*z(3)+eigenvectors(3,2)*sqrt(eigenvalues(2))*z(2)+eigenvectors(3,1)*sqrt(eigenvalues(1))*z(1);
% f5(4)=eigenvectors(4,5)*sqrt(eigenvalues(5))*z(5)+eigenvectors(4,4)*sqrt(eigenvalues(4))*z(4)+eigenvectors(4,3)*sqrt(eigenvalues(3))*z(3)+eigenvectors(4,2)*sqrt(eigenvalues(2))*z(2)+eigenvectors(4,1)*sqrt(eigenvalues(1))*z(1);
% f5(5)=eigenvectors(5,5)*sqrt(eigenvalues(5))*z(5)+eigenvectors(5,4)*sqrt(eigenvalues(4))*z(4)+eigenvectors(5,3)*sqrt(eigenvalues(3))*z(3)+eigenvectors(5,2)*sqrt(eigenvalues(2))*z(2)+eigenvectors(5,1)*sqrt(eigenvalues(1))*z(1);

However, if I calculate the correlation matrix for some realizations of this, the covariance matrix doesn't look like the kernel at all.

So I don't know what I should try next.
 
My take is:

Matlab:
for j = 1:10
   x=vals(j)*vecs(j)*z(j)
   sum=sum+sqrt(x)
end

I don’t know what the vecs[[j,all]] that’s something you’ll have to get from Mathematica. it looks to be related to matrix multiply against the z vector?
 
  • Like
Likes   Reactions: Frank Einstein
jedishrfu said:
My take is:

Matlab:
for j = 1:10
   x=vals(j)*vecs(j)*z(j)
   sum=sum+sqrt(x)
end

I don’t know what the vecs[[j,all]] that’s something you’ll have to get from Mathematica. it looks to be related to matrix multiply against the z vector?

Thank you very much for your answer. I will keep working on it.
 
vecs[[j, all]] should translate to vecs(j,:) or vecs(:,j). the semi-colon tells MATLAB to select all of the elements in that dimension (j,:) being everything in the jth row, and (:,j) being everything in the jth column.

So something like
sum = [];
for j = 1:10
sum = sum + sqrt(vals(j) .* vecs(:,j) .* z(j)) ;
end

the .* means to multiply element-wise ( so 2 .* [1 1 1] becomes [2 2 2])
vecs is a matrix, and so taking one row or column leaves it as an array, and so you need array operations like .*, ./ etc.
 
Hepth said:
and so taking one row or column leaves it as an array, and so you need array operations like .*, ./ etc.
In this particular case, you do not need them. The only thing with elements in your expression is vecs(:,j), vals(j) and z(j) are both numbers. 2*[1 1 1] also evaluates to [2 2 2].

Frank Einstein said:
My attempts have not given propper results, this is my code:

for i=1:long
z(i)=normrnd(0,1);
f(i)=0;
endfor i=1:long%times
for j=1:long%number of terms in the descomposition
f(i)=f(i)+sqrt(eigenvalues2(j))*z(j)*eigenvectors(i,j);
end

end
In general, you should try to avoid for loops in matlab. It was written to take care of matrix operations.

What OP wants to do, given that vals is a N length row vector, z is a N length row vector, and vecs is a NxN matrix is likely on the form:

Code:
f = sqrt(vals.*z)*sqrt(vecs);
The first sqrt(vals.*z) is an N array containing sqrt(vals(j)*z(j)) in element j. The second sqrt contains the square root elements of vecs, which should also go into the sum. The matrix multiplication performs the sum. You may need to add primes on vals and z to get them to row vector format and you may need a prime on vecs if it is the other index you want to contract with.
 
Frank Einstein said:
z(i)=normrnd(0,1);
Same thing with initialisations. There is no point in calling your random number generator multiple times. The first few lines in the randn function help read:
Code:
randn Normally distributed pseudorandom numbers.
    R = randn(N) returns an N-by-N matrix containing pseudorandom values drawn
    from the standard normal distribution.  randn(M,N) or randn([M,N]) returns
    an M-by-N matrix.
so
Code:
z = randn(1,N);
will do perfectly fine to get a row vector with N numbers distributed according to ##\mathcal N(0,1)##.

Frank Einstein said:
f(i)=0;
Likewise, this should not be in a for loop. It should be
Code:
f = zeros(1,N);
 

Similar threads

  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 32 ·
2
Replies
32
Views
4K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
3
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
Replies
3
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
2K