你好同学,给你编了一个专属函数ecdf2:
function [X, Y, CDF] = ecdf2(x,y,nx,ny,xminmax,yminmax)
% x:x的值
% y:y的值
% nx:x方向划分段数
% ny:y方向划分段数
% xminmax = [xmin, xmax]
% yminmax = [ymin, ymax]
num = length(x);
if(num~=length(y))
error('输入的x和y长度必须相等')
end
if(nargin>6) % 如果变量个数大于6个,太多了
error('太多输入变量')
elseif(nargin<2) % 如果变量个数小于2个,太少了
error('输入变量数目不足!!')
end
if(nargin==6) % 如果变量个数等于6个,赋值给ymin和ymax
ymin = yminmax(1);
ymax = yminmax(2);
end
if(nargin>=5)% 如果变量个数大于等于5个,赋值给xmin和xmax
xmin = xminmax(1);
xmax = xminmax(2);
end
if(nargin<=4)% 如果变量个数小于等于4个,自定义xmin和xmax
xmin = min(x);
xmax = max(x)+eps;
ymin = min(y);
ymax = max(y)+eps;
end
if(nargin<=3)% 如果变量个数小于等于3个,自定义y方向划分段数ny
ny = 30;
end
if(nargin==2)% 如果变量个数等于2个,自定义x方向划分段数nx
nx = 30;
end
xg = linspace(xmin, xmax, nx);%x方向的点
yg = linspace(ymin, ymax, ny);%y方向的点
[X,Y] = meshgrid(xg, yg);%形成网格
[I,J] = meshgrid(1:nx, 1:ny);%下标网格
CDF = arrayfun(@(i,j)sum(x<X(i,j)&y<Y(i,j))/num,I,J);%形成经验分布
end
然后调用就行:
clc;clear
num = 1000000;
x = randn(num,1);% 为了说明弄了两个正态分布搞联合,实际数据会更好
y = randn(num,1);
[X, Y, CDF] = ecdf2(x,y);% ,50,50,[-3, 3],[-3, 3]
surf(X,Y,CDF)
可以看到效果杠杠的: