Azzera filtri
Azzera filtri

Matrix Subtraction by taking mean of same matrix

2 visualizzazioni (ultimi 30 giorni)
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

Risposta accettata

Matt J
Matt J il 16 Nov 2021
Modificato: Matt J il 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 Commenti
Preet Lal
Preet Lal il 17 Nov 2021
Modificato: Preet Lal il 17 Nov 2021
What's process here?
It's not working
Matt J
Matt J il 17 Nov 2021
Modificato: Matt J il 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

Accedi per commentare.

Più risposte (0)

Prodotti


Release

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by