如何在 Matlab 中从给定的 PMF 计算 CDF
How to compute CDF from a given PMF in Matlab
对于 0
和 2\pi
之间 \theta
的给定 PMF p=f(\theta)
,我在 Matlab 中计算的 CDF 为
theta=0:2*pi/n:2*pi
for i=1:n
cdf(i)=trapz(theta(1:i),p(1:i));
end
结果得到验证
我试着用 cumsum
和 cdf=cumsum(p)*(2*pi)/n
做同样的事情,但结果是错误的。为什么?
如果给定的 PMF 是二维的 p=f(\theta,\phi)
,我如何计算 CDF?我可以不按照解释的那样详细说明吗 here?
在一维情况下,您可以使用 cumsum
获取循环的矢量化版本(假设 theta
和 p
都是列向量):
n = 10;
theta = linspace(0, 2*pi, n).';
p = rand(n,1);
cdf = [0; 0.5 * cumsum((p(1:n-1) + p(2:n)) .* diff(theta(1:n)))];
在 2D 情况下,函数 cumsum
将在垂直和水平方向应用两次:
nthet = 10;
nphi = 10;
theta = linspace(0, 2*pi, nthet).'; % as column vector
phi = linspace(0, pi, nphi); % as row vector
p = rand(nthet, nphi);
cdf1 = 0.5 * cumsum((p(1:end-1, :) + p(2:end, :)) .* diff(theta), 1);
cdf2 = 0.5 * cumsum((cdf1(:, 1:end-1) + cdf1(:, 2:end)) .* diff(phi), 2);
cdf = zeros(nthet, nphi);
cdf(2:end, 2:end) = cdf2;
对于 0
和 2\pi
之间 \theta
的给定 PMF p=f(\theta)
,我在 Matlab 中计算的 CDF 为
theta=0:2*pi/n:2*pi
for i=1:n
cdf(i)=trapz(theta(1:i),p(1:i));
end
结果得到验证
我试着用
cumsum
和cdf=cumsum(p)*(2*pi)/n
做同样的事情,但结果是错误的。为什么?如果给定的 PMF 是二维的
p=f(\theta,\phi)
,我如何计算 CDF?我可以不按照解释的那样详细说明吗 here?
在一维情况下,您可以使用 cumsum
获取循环的矢量化版本(假设 theta
和 p
都是列向量):
n = 10;
theta = linspace(0, 2*pi, n).';
p = rand(n,1);
cdf = [0; 0.5 * cumsum((p(1:n-1) + p(2:n)) .* diff(theta(1:n)))];
在 2D 情况下,函数 cumsum
将在垂直和水平方向应用两次:
nthet = 10;
nphi = 10;
theta = linspace(0, 2*pi, nthet).'; % as column vector
phi = linspace(0, pi, nphi); % as row vector
p = rand(nthet, nphi);
cdf1 = 0.5 * cumsum((p(1:end-1, :) + p(2:end, :)) .* diff(theta), 1);
cdf2 = 0.5 * cumsum((cdf1(:, 1:end-1) + cdf1(:, 2:end)) .* diff(phi), 2);
cdf = zeros(nthet, nphi);
cdf(2:end, 2:end) = cdf2;