Matlab 仅在原木刻度轴上大致正确

Matlab 仅在原木刻度轴上大致正确,matlab,point-in-polygon,Matlab,Point In Polygon,使用MATLAB的inpolygon函数确定多边形内的点时,我发现结果对于在线性轴上绘制的多边形是完全正确的,但对于在对数刻度轴上绘制的多边形,结果仅大致正确。虽然我的怀疑倾向于一个MATLAB错误,但我可能忽略了一些东西 下面的代码再现了我在处理其他数据时遇到的问题。结果如下图所示(底部面板组是顶部面板的缩放视图)。可以看出,对于在对数刻度轴上绘制的多边形(右),多边形内部有未标记点,多边形外部有标记点,这两种情况都不应出现。相反,对于在线性轴(左)上绘制的多边形,多边形测试是精确的 我想你遗

使用MATLAB的
inpolygon
函数确定多边形内的点时,我发现结果对于在线性轴上绘制的多边形是完全正确的,但对于在对数刻度轴上绘制的多边形,结果仅大致正确。虽然我的怀疑倾向于一个MATLAB错误,但我可能忽略了一些东西

下面的代码再现了我在处理其他数据时遇到的问题。结果如下图所示(底部面板组是顶部面板的缩放视图)。可以看出,对于在对数刻度轴上绘制的多边形(右),多边形内部有未标记点,多边形外部有标记点,这两种情况都不应出现。相反,对于在线性轴(左)上绘制的多边形,多边形测试是精确的


我想你遗漏了什么:正常刻度的线不是对数刻度的线。您的多边形在对数比例中绘制不正确,因为您绘制了2个点并将它们与一条直线放在一起

查看日志空间中的真实多边形:

close all
clear

n=2e4;
x(:,1)=rand(n,1); y(:,1)=rand(n,1);
x(:,2)=lognrnd(0.5,0.25,n,1); y(:,2)=lognrnd(0.5,0.25,n,1);
for m=1:2
    subplot(1,2,m);
    scatter(x(:,m),y(:,m),'.'); hold on;
    if(m==2)
        set(gca,'xscale','log'); set(gca,'yscale','log');
    end
    p=impoly(gca);
    pc=getPosition(p);
    % plot polygon
    hold on
    for ii=1:size(pc,1)-1
        plot(linspace(pc(ii,1),pc(ii+1,1),100),linspace(pc(ii,2),pc(ii+1,2),100),'g')
    end
    plot(linspace(pc(end,1),pc(1,1),100),linspace(pc(end,2),pc(1,2),100),'g')
    in=inpolygon(x(:,m),y(:,m),pc(:,1),pc(:,2));
    scatter(x(in,m),y(in,m),20);
end
查看此放大结果(单击放大):


之所以会出现这种情况,是因为多边形是在欧几里德空间中定义的,并且定义为由直线链接的点。如果你想在日志空间工作,事情可能会变得复杂。一种在数值上近似的方法是与我绘制的相反。在对数空间上创建足够密集的采样直线,将其转换为线性空间,并使用结果点定义高顶点多边形。然后使用多边形中的

哦,这是一个很好的观察结果!我完全忽略了它。当我运行代码(在R2014b上)时,多边形不会叠加。在线性空间中绘制的多边形被复制到日志空间,但由于轴不同,它最终位于日志空间轴的左下角。@user001哪些多边形不重叠?我的意思是,代码的全部要点是在第二个图中显示它们不存在,因为
log
space。我在2014b制作了代码和情节
close all
clear

n=2e4;
x(:,1)=rand(n,1); y(:,1)=rand(n,1);
x(:,2)=lognrnd(0.5,0.25,n,1); y(:,2)=lognrnd(0.5,0.25,n,1);
for m=1:2
    subplot(1,2,m);
    scatter(x(:,m),y(:,m),'.'); hold on;
    if(m==2)
        set(gca,'xscale','log'); set(gca,'yscale','log');
    end
    p=impoly(gca);
    pc=getPosition(p);
    % plot polygon
    hold on
    for ii=1:size(pc,1)-1
        plot(linspace(pc(ii,1),pc(ii+1,1),100),linspace(pc(ii,2),pc(ii+1,2),100),'g')
    end
    plot(linspace(pc(end,1),pc(1,1),100),linspace(pc(end,2),pc(1,2),100),'g')
    in=inpolygon(x(:,m),y(:,m),pc(:,1),pc(:,2));
    scatter(x(in,m),y(in,m),20);
end