我在计算Matlab中的核密度估计(KDE)产生的2D轮廓区域时遇到了困难。我有三个变量:
X和Y = meshgrid,计算变量'density'(256x256) 密度=从KDE(256x256)计算的密度
我运行代码
轮廓(X,Y,密度,10)
这会生成附加的图。对于10个轮廓水平中的每一个,我想计算面积。我在其他一些平台上做过这样的事情,比如R,但我在Matlab中找出正确的方法/语法时遇到了麻烦。
C = contourc(密度)
我相信上面的行会存储轮廓的所有值,允许我计算区域,但我不完全理解这些值是如何存储的,也不是如何正确地得到它们。
任何帮助或建议将不胜感激!非常感谢你。
答案 0 :(得分:2)
以下是我发布的关于usage of Matlab contour(...) function的类似问题。
主要思想是正确操作返回变量。在你的例子中
c = contour(X,Y,density,10)
变量c可以返回并用于对等值线的任何计算,包括面积。
答案 1 :(得分:2)
这个小脚本可以帮到你。它是contour
的一般。可能也适用于contour3
和contourf
,当然还需要进行调整。
[X,Y,Z] = peaks; %example data
% specify certain levels
clevels = [1 2 3];
C = contour(X,Y,Z,clevels);
xdata = C(1,:); %not really useful, in most cases delimters are not clear
ydata = C(2,:); %therefore further steps to determine the actual curves:
%find curves
n(1) = 1; %n: indices where the certain curves start
d(1) = ydata(1); %d: distance to the next index
ii = 1;
while true
n(ii+1) = n(ii)+d(ii)+1; %calculate index of next startpoint
if n(ii+1) > numel(xdata) %breaking condition
n(end) = []; %delete breaking point
break
end
d(ii+1) = ydata(n(ii+1)); %get next distance
ii = ii+1;
end
%which contourlevel to calculate?
value = 2; %must be member of clevels
sel = find(ismember(xdata(n),value));
idx = n(sel); %indices belonging to choice
L = ydata( n(sel) ); %length of curve array
% calculate area and plot all contours of the same level
for ii = 1:numel(idx)
x{ii} = xdata(idx(ii)+1:idx(ii)+L(ii));
y{ii} = ydata(idx(ii)+1:idx(ii)+L(ii));
figure(ii)
patch(x{ii},y{ii},'red'); %just for displaying purposes
%partial areas of all contours of the same plot
areas(ii) = polyarea(x{ii},y{ii});
end
% calculate total area of all contours of same level
totalarea = sum(areas)
示例:峰值(通过Matlab)
级别value=2
是绿色轮廓,第一个循环获取所有轮廓线,第二个循环计算所有绿色多边形的区域。最后总结一下。
如果你想获得所有级别的所有总区域,我宁愿写一些小函数,而不是使用另一个循环。您还可以考虑,仅绘制每个计算所需的级别。这样contourmatrix
会更容易,您可以简化流程。如果您没有多个形状,我只需使用标量指定级别,并使用contour
仅为此级别获取C
,删除xdata
的第一个值并{ {1}}并使用ydata