我有三个变量,例如纬度,经度和温度。对于每个纬度和经度,我有相应的温度值。我想在5度x 5度网格中绘制纬度v / s经度图,平均温度值插入特定网格而不是发生频率。
Data= [latGrid,lonGrid] = meshgrid(25:45,125:145);
T = table(latGrid(:),lonGrid(:),randi([0,35],size(latGrid(:))),...
'VariableNames',{'lat','lon','temp'});
最后,我需要它有点像下图:
答案 0 :(得分:2)
听起来像你想要缩放你的网格。最简单的方法是平滑和缩减采样。
虽然2d直方图也将值分成网格,但使用直方图并不是在平滑网格中找到数据点的平均值的方法。直方图计算一组范围中值的出现次数。在第二个例子中,直方图将采用输入测量值[1,3,3,5]并计算一个数量,三个数量等。二维直方图将计算数字对的出现次数。 (您可能希望使用直方图来帮助组织不定期的测量,但这将是一个不同的问题)
将数据保存为2d矩阵格式,而不是将其重新整理为表格。这样可以更轻松地找到每个网格位置的邻居。
%% Sample Data
[latGrid,lonGrid] = meshgrid(25:45,125:145);
temp = rand(size(latGrid));
Matlab中有许多工具用于平滑矩阵。如果你想要5x5窗口的平均值。您可以编写for循环,使用卷积或使用filter2
。我的例子使用卷积。有关卷积滤波器的更多信息,我建议the wikipedia page。
%% Mean filter with conv2
M = ones(5) ./ 25; % 5x5 mean or box blur filter
C_temp = conv2(temp, M, 'valid');
C_temp
是原始温度变量的模糊版本,尺寸略小,因为我们无法准确获取边缘的平均值。边界减少了2帧的测量值。现在,我们只需要从C_temp
开始每五个测量来缩小网格。
%% Subsample result
C_temp = C_temp(1:5:end, 1:5:end);
% Because we removed a border from C_temp, we also need to remove a border from latGrid and lonGrid
[h, w] = size(latGrid)
latGrid = latGrid(5:5:h-5, 5:5:w-5);
lonGrid = lonGrid(5:5:h-5, 5:5,w-5);
这是步骤的样子
如果您使用稍微更有条理的temp
变量。更容易看出结果是正确的。
imresize
有一个框过滤方法选项,相当于均值过滤器。但是,您必须进行一些计算才能找到相当于使用5x5窗口的缩放系数。
C_temp = imresize(temp, scale, 'box');