如何在MATLAB中使用三个变量计算直方图?

时间:2017-08-17 13:28:22

标签: matlab histogram matlab-figure

我有三个变量,例如纬度,经度和温度。对于每个纬度和经度,我有相应的温度值。我想在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'});  

最后,我需要它有点像下图:

Image

1 个答案:

答案 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);

这是步骤的样子

Smooth and Downsample Steps

如果您使用稍微更有条理的temp变量。更容易看出结果是正确的。

Smooth and Downsample Identity Matrix

使用图像处理工具箱

imresize有一个框过滤方法选项,相当于均值过滤器。但是,您必须进行一些计算才能找到相当于使用5x5窗口的缩放系数。

C_temp = imresize(temp, scale, 'box');