MATLAB: How to solve “Index exceeds matrix dimensions.”

matrixmatrix dimensions

% problem occured at following line (line 61) if length(slp_po_t)
%Main code
clear;close all;
lat=ncread('ds010.0.20130511.20130516.nc','lat');
lon=ncread('ds010.0.20130511.20130516.nc','lon');
slp=ncread('ds010.0.20130511.20130516.nc','slp');
%size(slp1)
%[row, col] = size(slp1);
slp_cen = 99999999999.9;
for icen = 1:length(slp)
for jcen = 1:length(slp)
if slp(icen,jcen)<slp_cen
slp_cen = slp(icen,jcen);
i_cen = icen;
j_cen = jcen;
end
end
end
[lonx,laty] = meshgrid(lat,lon);
i_ceny = laty(i_cen,1);
j_cenx = j_cen;
lonx = lonx - j_cenx;
laty = laty - i_ceny;
%---wavenumber 1---sigma=0.9----r<100km-
rmax = 25;
rmin = 0.5;
thetad=2; %interpolate angle grid
disd =0.5 ; %interpolate grid
for idis = 1:1:((rmax-rmin)/disd+1)
for ith = 1:1:(360/thetad)
x_po_in(ith,idis) = ((idis-1)*disd+rmin)*cos((ith-1)*thetad*pi/180);
y_po_in(ith,idis) = ((idis-1)*disd+rmin)*sin((ith-1)*thetad*pi/180);
end
end
size(lonx)
size(laty)
slp1=slp(:,:,12);
a=single(lonx);
b=single(laty);
size(slp1)
slp_po_in = interp2(a,b,slp1,x_po_in, y_po_in,'linear');
for i = 1:size(x_po_in,2)
slp_w1_in(:,i) = fft(slp_po_in(:,i),1,1);
slp_w1_in(:,i) = slp_w1_in(:,i) - sum(slp_w1_in(:,i))/180;
end
[x_rc_in,y_rc_in] = meshgrid(-25:0.5:25,-25:0.5:25);
for i = 1:size(x_rc_in,1)
for j = 1:size(x_rc_in,2)
logislp = find((abs(x_po_in - x_rc_in(i,j))<0.5)&(abs(y_po_in - y_rc_in(i,j))<0.5));
slp_po_t = slp_w1_in(logislp);
if length(slp_po_t)
slp_w1_w1_rc_in(i,j) = sum(slp_po_t)/~isempty(slp_po_t);
end
end
end
[x_min_in,y_min_in] = find(slp_w1_w1_rc_in==min(min(slp_w1_w1_rc_in)));
x_min_in = x_min_in(1);
y_min_in = y_min_in(1);
theta0p9_min_in(ik) = atan(y_rc_in(x_min_in,y_min_in)/x_rc_in(x_min_in,y_min_in))*180/pi;
if x_rc_in(x_min_in,y_min_in)>=0 &&y_rc_in(x_min_in,y_min_in)>=0
theta0p9_min_in(ik) %do nothing
elseif x_rc_in(x_min_in,y_min_in)<0 &&y_rc_in(x_min_in,y_min_in)>=0
theta0p9_min_in(ik) = theta0p9_min_in(ik)+180;
elseif x_rc_in(x_min_in,y_min_in)<0 &&y_rc_in(x_min_in,y_min_in)<0
theta0p9_min_in(ik) = theta0p9_min_in(ik)+180;
elseif x_rc_in(x_min_in,y_min_in)>=0 &&y_rc_in(x_min_in,y_min_in)<0
theta0p9_min_in(ik) = theta0p9_min_in(ik)+360;
end
if plot ==1 %#ok<LTARG>
figure
[~,~] = contourf(a,b,slp1);
figure
contour(x_po_in,y_po_in,slp_po_in);
figure
contour(x_po_in,y_po_in,slp_w1_in);
figure
[~,~] = contourf(x_rc_in,y_rc_in, slp_w1_w1_rc_in);
end

Best Answer

You create x_po_in with size depending on the data.
You define x_rc_in with constant size through meshgrid.
You do find() against the size of one of them, and you expect the results to be valid to access the other of them.