mean of all these variables over latitude x longitude x time that is (5 x 5 x 2)
Ältere Kommentare anzeigen
I have eight variables loaded with data (latitude,longitude,time,months) as (5,5,2,65). I want to calculate the mean of all these variables over latitude x longitude x time that is (5 x 5 x 2). My output should have the dimensions of (65,8), that is mean values of 8 variables for 65 months.
I would be highly obliged to get fews lines of matlab code to do it.
regards,
Devendra
3 Kommentare
"I have eight variables loaded with data (latitude,longitude,time,months) as (5,5,2,65)."
Rather than eight separate variables, you should store that data in one array in the first place.
For example, a cell array:
C = arrayfun(@(m)rand(5,5,2,65),1:8,'uni',0); % fake data
Then your task is much easier and generally more efficient, e.g.:
M = permute(mean(cat(5,C{:}),1:3),[4,5,1,2,3])
M = reshape(mean(cat(5,C{:}),1:3),[],numel(C)) % See Arya Chandan Reddy's answer
Devendra
am 1 Jul. 2023
Stephen23
am 1 Jul. 2023
"How to aviod NaN numvers in data set?"
Use the OMITNAN flag.
Akzeptierte Antwort
Weitere Antworten (4)
Arya Chandan Reddy
am 30 Jun. 2023
Hi Devendra, I understand that you are trying to calculate mean of your data (5x5x2) over 65 months for each of the 8 variables.
Assuming that you data is in the format 5x5x2x65x8
Here is the code:
x = rand([5 5 2 65 8]);
m = mean(x , [1 2 3]);
m = reshape(m , [65 8]);
Hope it helps
2 Kommentare
Devendra
am 30 Jun. 2023
+1 tidy solution, neat use of RESHAPE. Using one array is good advice,
"data format for each variable is (5,5,2,65) not (5,5,2,65,8) as presumed by you and there are 8 variables"
You can simply use CAT to join them together:
x = cat(5,A1,A2,..,A8);
Even better is to not have eight separate variables in the first place.
If your data is a bunch of individual numeric arrays:
% some fake data
x1 = rand(5,5,2,65);
x2 = rand(5,5,2,65);
x3 = rand(5,5,2,65);
x4 = rand(5,5,2,65);
x5 = rand(5,5,2,65);
x6 = rand(5,5,2,65);
x7 = rand(5,5,2,65);
x8 = rand(5,5,2,65);
allmeans = [squeeze(mean(x1,1:3)) ...
squeeze(mean(x2,1:3)) ...
squeeze(mean(x3,1:3)) ...
squeeze(mean(x4,1:3)) ...
squeeze(mean(x5,1:3)) ...
squeeze(mean(x6,1:3)) ...
squeeze(mean(x7,1:3)) ...
squeeze(mean(x8,1:3))];
Alternatively,
% or maybe use a cell array
C = {x1 x2 x3 x4 x5 x6 x7 x8};
allmeans = cellfun(@(x) squeeze(mean(x,1:3)),C,'uniform',false);
allmeans = cell2mat(allmeans);
2 Kommentare
Devendra
am 30 Jun. 2023
If you want to simply ignore the NaNs, you can use the 'omitnan' flag in the calls to mean().
mu = mean([1 2 3 4 NaN],'omitnan')
Peter Perkins
am 17 Jul. 2023
0 Stimmen
It's very likely that you should be using a timetable.
You have "eight variables loaded with data (latitude,longitude,time,months) as (5,5,2,65)". I think you mean that you have 8 5x5x2x65 arrays. Here's what I recommend:
create the lat/lon/time/month values as 5/5/2/65-element vectors, respectively. Use ndgrid to expand those out to four 5x5x2x65 matrices, where each one of them has a lot of repeated lat/lon/time/month values. Turn those four "coordinate" arrays and your eight data arrays into columns using (:), and put those into a (5*5*2*65)-by-(4+8) table. Now call groupsummary to compute monthy means, or month-by-time means, or lat-by-lon means.
Depending on what timestamps you have, you may want to look at using datetimes, or durations, and putting your data in a timetable. Not enough info to go on.
Cris LaPierre
am 20 Jul. 2023
0 Stimmen
Kategorien
Mehr zu Operators and Elementary Operations finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!