好的,我想我已经解决了……已经很接近了,可以开心了。
首先我获取原始数据(我称之为mask_rho 并使用它来制作掩码mask_u、mask_v,这类似于mask_rho,但分别在水平和垂直方向上略有偏移。
%make mask_u and mask_v
for i = 2:size(mask_rho,2)
for j = 1:size(mask_rho,1)
mask_u(j, i-1) = mask_rho(j, i) * mask_rho(j, i-1);
end
end
for i = 1:size(mask_rho,2)
for j = 2:size(mask_rho,1)
mask_v(j-1, i) = mask_rho(j, i) * mask_rho(j-1, i);
end
end
然后我制作修改后的掩码mask_u1 和mask_v1,它们与mask_rho 相同,但分别与水平和垂直方向上的相邻点进行平均。
%make mask which is shifted E/W (u) and N/S (v)
mask_u1 = (mask_rho(1:end-1,:)+mask_rho(2:end,:))/2;
mask_v1 = (mask_rho(:,1:end-1)+mask_rho(:,2:end))/2;
然后我使用掩码之间的差异来定位掩码在水平方向(在 u 掩码中)和在垂直方向(在 v 掩码中)从 0 变为 1 和 1 变为 0 的位置。
% mask_u-mask_u1 gives the NEXT row with a change from 0-1.
diff_mask_u=logical(mask_u-mask_u1);
lon_u_bnds=lon_u.*double(diff_mask_u);
lon_u_bnds(lon_u_bnds==0)=NaN;
lat_u_bnds=lat_u.*double(diff_mask_u);
lat_u_bnds(lat_u_bnds==0)=NaN;
lon_u_bnds(isnan(lon_u_bnds))=[];
lat_u_bnds(isnan(lat_u_bnds))=[];
%now same for changes in mask_v
diff_mask_v=logical(mask_v-mask_v1);
lon_v_bnds=lon_v.*double(diff_mask_v);
lon_v_bnds(lon_v_bnds==0)=NaN;
lat_v_bnds=lat_v.*double(diff_mask_v);
lat_v_bnds(lat_v_bnds==0)=NaN;
lon_v_bnds(isnan(lon_v_bnds))=[];
lat_v_bnds(isnan(lat_v_bnds))=[];
bnd_coords_cat = [lon_u_bnds,lon_v_bnds;lat_u_bnds,lat_v_bnds]'; %make into 2 cols, many rows
并且结果抓取了边界边缘的所有坐标:
现在我的回答有点不对劲。如果我将上面的向量绘制为点plot(bnd_coords_cat(:,1),bnd_coords_cat(:,2),'kx',我会得到上面的图像,这很好。但是,如果我加入这条线,例如:plot(bnd_coords_cat(:,1),bnd_coords_cat(:,2),'-',那么这条线就会跳来跳去,因为这些点没有被排序。当我进行排序(使用sort 和pdist2)按最近点排序时,Matlab 有时会选择奇数点......不过我想我会将这段代码作为附录包含在内,并且是可选的额外内容。可能有人知道更好的对输出向量进行排序的方法bnds_coords_cat:
% now attempt to sort
[~,I]=sort([lon_u_bnds,lon_v_bnds]);
bnd_coords_inc1 = bnd_coords_cat(I,1);
bnd_coords_inc2 = bnd_coords_cat(I,2);
bnd_coords = [bnd_coords_inc1,bnd_coords_inc2];
bnd_coords_dist = pdist2(bnd_coords,bnd_coords);
bnd_coords_sort = nan(1,size(bnd_coords,1));
bnd_coords_sort(1)=1;
for ii=2:size(bnd_coords,1)
bnd_coords_dist(:,bnd_coords_sort(ii-1)) = Inf; %don't go backwards?
[~,closest_idx] = min(bnd_coords_dist(bnd_coords_sort(ii-1),:));
bnd_coords_sort(ii)=closest_idx;
end
bnd_coords_final(:,1)=bnd_coords(bnd_coords_sort,1);
bnd_coords_final(:,2)=bnd_coords(bnd_coords_sort,2);
请注意,pdist2 方法是由一位同事建议的,也来自这个 SO 答案Sort coordinates points in matlab。这是最终结果:
说实话,没有线的情节很好。因此,就我而言,这已经足够接近可以回答了!