years in fourth dimension is not printing properly

조회 수: 1 (최근 30일)
Gurumoorthi K
Gurumoorthi K 2023년 7월 6일
답변: Peter Perkins 2023년 7월 17일
Dear Matlab community,
I am trying to calculate monthly and seas (seasonal) mean/sum for each year at each grid. My output (mhwday_month1, mhwday_seas1,...) shows same values in all the year. Means, month 1 to 12 is ok, but it is printing same values for all the years (:, :, 1, 1 to :, :, 1, 2,.. etc). Can you suggest me what is missed? or please modify it. Thanks
date_used=datevec(datenum(1993,1,1):datenum(2016,12,31));
% Determining land index
land_index=isnan(nanmean(mhw_ts,3));
% Monthly
numYears = 24;
mhwday_month1=NaN(size(mhw_ts,1),size(mhw_ts,2),12,numYears); % lon-lat-month
mhwint_month1=NaN(size(mhw_ts,1),size(mhw_ts,2),12,numYears); % lon-lat-month
for i=1:12
index_used = date_used(:, 2) == i;
temp = sum(~isnan(mhw_ts(:, :, index_used)), 3, 'omitnan')./(2016-1993+1); % Calculate the average MHW days for each location and year
for j = 1:numYears
mhwday_month1(:, :, i, j) = temp; % Assign the values to the appropriate slice of mhwday_month1
mhwint_month1(:, :, i, j) = mean(mhw_ts(:, :, index_used), 3, 'omitnan');
end
end
mhwday_month1(repmat(land_index, 1, 1, 12, numYears)) = nan;
mhwint_month1(repmat(land_index, 1, 1, 12, numYears)) = nan;
% SPR-SON SUM-DJF AUT-MAM WIN-JJA
seas=[9 10 11;...
12 1 2;...
3 4 5;...
6 7 8];
mhwday_seas1 = NaN(size(mhw_ts, 1), size(mhw_ts, 2), 4, numYears);
mhwint_seas1 = NaN(size(mhw_ts, 1), size(mhw_ts, 2), 4, numYears);
for i = 1:4
index_used = ismember(date_used(:, 2), seas(i, :));
temp = sum(~isnan(mhw_ts(:, :, index_used)), 3, 'omitnan')./(3 * (2016-1993+1));
mhwday_seas1(:, :, i, :) = repmat(temp, [1, 1, 1, numYears]);
mhwint_seas1(:, :, i, :) = repmat(mean(mhw_ts(:, :, index_used), 3, 'omitnan'), [1, 1, 1, numYears]);
mhwday_seas1(repmat(land_index, 1, 1, 1, numYears)) = nan;
mhwint_seas1(repmat(land_index, 1, 1, 1, numYears)) = nan;
end
% Extracting monthly MHW days for all the year in a specific location
mhwday_month_domain = squeeze(mhwday_month1(:, :, :, :));
% Extracting MHW intensity for for all the year in a specific location
mhwint_month_domain = squeeze(mhwint_month1(:, :, :, :));
%mhwint_month_domain = reshape(mhwint_month_domain, 1, []);
Unrecognized function or variable 'mhw_ts'.

답변 (2개)

Sivsankar
Sivsankar 2023년 7월 6일
Hi Gurumoorthi,
From what I could understand from your question, I think the issue you're facing is caused by the way you're assigning values to mhwday_month1 and mhwint_month1 in the nested loop. You're assigning the same value temp to all years for each month. To fix this, you need to modify the assignment inside the nested loop. Here's the modified code:
for i = 1:12
index_used = date_used(:, 2) == i;
temp = sum(~isnan(mhw_ts(:, :, index_used)), 3, 'omitnan')./(2016-1993+1); % Calculate the average MHW days for each location and year
for j = 1:numYears
mhwday_month1(:, :, i, j) = temp(:, :, j); % Assign the values to the appropriate slice of mhwday_month1
mhwint_month1(:, :, i, j) = mean(mhw_ts(:, :, index_used), 3, 'omitnan');
end
end
Similarly, you need to make a similar modification in the nested loop for calculating seasonal means.
for i = 1:4
index_used = ismember(date_used(:, 2), seas(i, :));
temp = sum(~isnan(mhw_ts(:, :, index_used)), 3, 'omitnan')./(3 * (2016-1993+1));
for j = 1:numYears
mhwday_seas1(:, :, i, j) = temp(:, :, j);
mhwint_seas1(:, :, i, j) = mean(mhw_ts(:, :, index_used), 3, 'omitnan');
end
mhwday_seas1(repmat(land_index, 1, 1, 1, numYears)) = nan;
mhwint_seas1(repmat(land_index, 1, 1, 1, numYears)) = nan;
end
These modifications ensure that the values assigned to mhwday_month1 and mhwint_month1 are specific to each year within the nested loop. I believe this must solve your issue. Or else you could reply. Thanks
  댓글 수: 1
Gurumoorthi K
Gurumoorthi K 2023년 7월 6일
There is an issue with the code. It shows data in val(:,:,1,1). Remaining all month,years shows NaN. e.g. output is attached.
I am expecting :, :, month, year output. Then seasonal mean/sum (:, :, season, year). I thank and appretiate you for spending time for me.

댓글을 달려면 로그인하십시오.


Peter Perkins
Peter Perkins 2023년 7월 17일
I can't follow youre code, but my strong recommendation is to read in your data using readtimetable, and then use groupsummary or retime. It's one line of code to compute yearly or monthly summaries.

카테고리

Help CenterFile Exchange에서 Genomics and Next Generation Sequencing에 대해 자세히 알아보기

제품


릴리스

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by