Matrix Subtraction by taking mean of same matrix

1 view (last 30 days)
I want to subtract of data which is of 413 X 264 and from taking a mean of same data with 45x45 matrix
My code is
winSz = [45,45]; % window size [width (x), height (y)]
[m, n] = size(HH_lin_0p2km);
winX0 = 1:winSz(1):n-winSz(1)+1; % starting index of x-values for each window
winY0 = 1:winSz(2):m-winSz(2)+1; % starting index of y-values for each window
xWin = 0:winSz(1)-1;
yWin = 0:winSz(2)-1;
for i = 1:size(HH_C,1)
for j = 1:size(HH_C,2)
HH_C = HH_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin)-nanmean(HH_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin),'all');
HV_C = HV_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin)-nanmean(HV_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin),'all');
end
end
And I am getting error as:
I am looking for output in 413x264 MATRIX
ndex exceeds the number of array elements. Index must not exceed 5.
Error in Soil_Moisture_Estimation (line 492)
HH_C = HH_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin)-nanmean(HH_lin_0p2km(winY0(i)+yWin, winX0(j)+xWin),'all');
Any one please help

Accepted Answer

Matt J
Matt J on 16 Nov 2021
Edited: Matt J on 16 Nov 2021
It would be faster to use sepblockfun from the File Exchange,
HH_C = process(HH_lin_0p2km);
HV_C = process(HV_lin_0p2km);
function out=process(H)
winSz = [45,45]; % window size [width (x), height (y)]
[m, n] = size(H);
mm=ceil(winSz(1)/m)*m;
nn=ceil(winSz(2)/n)*n;
if mm*nn>m*n, H(mm,nn)=0; end
nanmap=isnan(H);
H(nanmap)=0;
Means=sepblockfun(H,winSz,'sum')./sepblockfun(nanmap,winSz,'sum');
out=H-repelem(Means,winSz);
out(nanmap)=nan;
out=out(1:m,1:n);
end
  2 Comments
Preet Lal
Preet Lal on 17 Nov 2021
Edited: Preet Lal on 17 Nov 2021
What's process here?
It's not working
Matt J
Matt J on 17 Nov 2021
Edited: Matt J on 17 Nov 2021
How about the following modified version? I've run it on a 2x2 winSz as a test.
winSz=[2,2];
H=randi(4,4)
H = 4×4
3 2 4 3 1 3 2 1 3 4 1 3 4 3 3 3
[H_C,blockMeans] = process(H,winSz)
H_C = 4×4
0.7500 -0.2500 1.5000 0.5000 -1.2500 0.7500 -0.5000 -1.5000 -0.5000 0.5000 -1.5000 0.5000 0.5000 -0.5000 0.5000 0.5000
blockMeans = 4×4
2.2500 2.2500 2.5000 2.5000 2.2500 2.2500 2.5000 2.5000 3.5000 3.5000 2.5000 2.5000 3.5000 3.5000 2.5000 2.5000
function [out,Means]=process(H,winSz)
[m, n] = size(H);
mm=ceil(winSz(1)/m)*m;
nn=ceil(winSz(2)/n)*n;
if mm*nn>m*n, H(mm,nn)=0; end
nanmap=isnan(H);
H(nanmap)=0;
Means=sepblockfun(H,winSz,'sum')./sepblockfun(~nanmap,winSz,'sum');
Means=repelem(Means,winSz(1),winSz(2));
out=H-Means;
out(nanmap)=nan;
out=out(1:m,1:n);
end

Sign in to comment.

More Answers (0)

Products


Release

R2021b

Community Treasure Hunt

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

Start Hunting!