遍历像素计算Koppen-Geiger分类时赋值错误问题排查
问题分析与解决方案
错误原因
你遇到的尺寸不匹配错误,核心是索引顺序混乱+时间序列提取错误:
- 你的温度数组
T维度为(712,652,12)(纬度数、经度数、时间数),但循环中用T(lon, lat)提取数据,把经度和纬度的索引顺序完全搞反了。 - 这种错误的提取方式没有明确指定时间维度,导致传给
KoppenGeiger的不是单个像素的12个时间点序列,而是错误的二维切片,最终函数返回了整个712×652的分类结果,无法赋值给单个像素的1×1位置。
修正后的代码
% 检查维度 [lat_num, lon_num, time_num] = size(T); [lat_p_num, lon_p_num, time_p_num] = size(P); % 确保温度和降水的空间/时间维度一致 assert(lat_num == lat_p_num && lon_num == lon_p_num, '温度与降水的空间维度不匹配'); assert(time_num == time_p_num, '温度与降水的时间维度不匹配'); % 创建结果存储数组 Class = zeros(lat_num, lon_num); BroadClass = zeros(lat_num, lon_num); % 逐像素循环计算 for lat = 1:lat_num for lon = 1:lon_num % 提取单个像素的时间序列(转成一维数组) Te = squeeze(T(lat, lon, :)); Pr = squeeze(P(lat, lon, :)); % 计算柯本分类 [pixel_Class, pixel_BroadClass] = KoppenGeiger(Te, Pr, classes); % 赋值到对应位置 Class(lat, lon) = pixel_Class; BroadClass(lat, lon) = pixel_BroadClass; end end
关键修正点
- 索引顺序修正:循环时先遍历纬度
lat,再遍历经度lon,提取数据时用T(lat, lon, :)匹配数组维度定义。 - 时间序列提取:用
:明确指定时间维度,再通过squeeze去掉多余的单维度,确保传给KoppenGeiger的是12个元素的一维数组,让函数返回单个像素的分类值。 - 维度一致性检查:添加
assert语句提前验证温度和降水数据的维度匹配,避免后续隐藏错误。
内容的提问来源于stack exchange,提问作者Manikandan Sathiyanarayanan
相关产品推荐
相关产品推荐

