applying algebraic eqns across multiple dimesions of matrix using indexing

1 次查看(过去 30 天)
I am "time-stepping" an electromagnetic field at time instances per frequency
The EM field value at time-zero is a 3D matrix of dimensions [nvalues x 1 x nfrequencies] (see attached)
I want to create a 4D matrix where time is the 4th dimension and apply an algebraic equation across each dimension based on the value of the variables stored in arrays [frequency] and [time]
ie
size(EM_freq_time) = [nvalues x 1 x frequencies x time]
to attempt this i create a matrix of zeros
EM_freq_time = zeros(length(Ex), length(frequencies), length(t));
the equation i must apply is
EM_value(frequency,time,phase) = value*sin(2*pi.*frequencies.*t+Phase)
where frequency is a column vector size [nfreqs, 1]
time is a column vector size [nsteps, 1]
phase is a column vector size [nvalues]
how can i apply this equation using indexing?
  2 个评论
Bob Thompson
Bob Thompson 2019-4-25
'how can i apply this equation using indexing?'
What exactly do you mean by this? Are you looking to run loops to examine different sets of values and want to index each set, or are you looking to get multiple sets at once using some kind of vector method? I would just appreciate some expansion on what exactly you're looking for.
As a side note, why do you have a 4D matrix when one of your dimensions is size one? There's nothing technically wrong with this, it just seems like making things '4D' unnecessarily complicates the problem.
Sean Phillips
Sean Phillips 2019-4-25
编辑:Sean Phillips 2019-4-25
Hi Thanks for your reply - i thought it would require further explanation. but i wanted to see if there were any answerers to my question first.
You are right about the dimension this can be simplied although i working with it this way in case i need to add another column of data to the base matrix.
the eqn i need to apply is this
EM_value(frequency,time,phase) = value*sin(2*pi.*frequencies.*t+Phase)
what you see with Ex.mat is the values which are calculated with an external program
Ex has values for each position and frequency.
ie size(Ex) = [npositions x 1 (column of values) x frequencies)
ie Ex(:,:,5) would be all the value for each position for frequency 5 up to frequency n.
i then need to time step this so i want to create a 4th dimension for time.
ie Ex_freq_time (:,:,1,1) would be for frequency 1 and time step 1
the values of the variables frequency and time are stored in arrays
so for example for
Ex_freq_time(:,:,2,2) would be applying the value of the 2nd element of the frequency and time array for the eqn for each row in the column which stores the time and frequency varying values
Ex(frequency,time,phase) = Ex*sin(2*pi.*frequencies.*t+Phase)
where Phase is the same length as Ex
so for each matrix in the first 2 dimesions Ex and Phase are the same length and correspond with the number of positions at which these are calculated and we apply a fixed value of freq and time based on the index which corresponds to the element of the frequency and time arrays.
so again Ex_freq_time(:,:,10,2) would use the value of the tenth element of the frequency array and the 2nd element of the time array for each row of values in the "base matrix"
so to answer your question i want to get mutltiple sets at once using some kind of vector method that corresponds to the index of the 3rd (freq) and 4th (time) dimension and uses the value for the variables of frequency and time arrays based on the indexes.
thank you!
I had something like this but i dont know how this will work based on order MATLAB works/
Ex_freq_time(:,:,5,5) = Ex(*sin(2*pi.*frequencies(5).*time(5)+Phase)
this is not correct but it is where my thoughts are currently.

请先登录,再进行评论。

采纳的回答

Bob Thompson
Bob Thompson 2019-4-25
Ok, you aren't too far off with your thoughts, but I'll include an example.
You should be able to cover the first and second dimension all at once, but because you want to look at specific values in the third and fourth dimensions you will need to loop them, as far as I know.
for i = 1:size(Ex,3) % Loop through each frequency
for j = 1:length(time) % Loop through each time value, not really sure where you're getting this from, but I'm also just setting this up as a template
Ex_freq_time(:,:,i,j) = Ex(:,:,i)*sin(2*pi*frequencies(i).*time(j)+Phase);
end
end
You may also need to index Phase (probably with i, because it matches the number of frequencies), but I wasn't entirely sure where you were getting it from. Sorry, I'm a very visual person, and this forum doesn't do pictures too well.
Let me know if you have any problems, or need clarification.
  6 个评论
Bob Thompson
Bob Thompson 2019-4-26
I believe the videowriter command allows you to save the video variable to an appropriate file.
Sean Phillips
Sean Phillips 2019-4-26
thanks. ill get it working and show you the result which i achieved due to your help :)

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by