这篇 blog 将展示用 matlab 计算并画出大量数据的 CDF (累计分布函数)的两种方法。第一种是我自己于2012年写的,后来用的过程中发现有缺陷;后来2014年写另一篇paper时,搜寻到第二种简易又高效的方法。这里我给出它们各自的用例,包括画图用的数据与脚本,以及效果图。For your reference.
============================================================================================
Section A. 第一种方法
今天(2012-10-17)有一些数据需要处理,这些数据好不容易从文件中剥离了出来,然后自己写了一个function,计算并控制 plot 这些数据的 CDF 图。因为第一种方法用到的例子的数据文件太大,就没有贴上来。如果有想亲自试验一下这个过程的同学,请参照下文中第二个方法中的完整用例。
% ----------------------- 自实现 CDF 计算 function: funcCDF.m
% para@1: CNT_pnts, the number of points to denote the CDF;
% para@2: Range_low, the lower bound of variable;
% para@3: Range_up, the upper bound of variable;
% para@4 : arr_Vals, array of the values to be processed.
function [x, CDF_Vals] = funcCDF(CNT_pnts, Range_low, Range_up, arr_Vals)
data = sort( arr_Vals' ); % T', horizon arrays of T.
N = length(data);
stepLen = (Range_up-Range_low)/CNT_pnts;
Counter = zeros(1,CNT_pnts);
for i = 1:1:N
for j = 1:1:CNT_pnts
if ( data(1,i) <= (Range_low + j*stepLen) )
Counter(1,j) = Counter(1,j) + 1;
end
end
end
CDF = Counter(1,:)./N;
CDF_Vals = CDF(1,:)';
x = (Range_low+stepLen):stepLen:Range_up;
% ---- end of func.
% --------------------- 2 use cases:
CNT_pnts = 100;
deadline_N500r1 = 550;
deadline_N500r3 = 270;
deadline_N500r5 = 240;
PntVal_N500Tau100r1 = textread('N500Tau100r1.tr','%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %.2f');
[x_r1,cdf_r1] = funcCDF(CNT_pnts, 0, deadline_N500r1, PntVal_N500Tau100r1);
plot(x_r1, cdf_r1, 'ob')
hold on
PntVal_N500Tau100r3 = textread('N500Tau100r3.tr','%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %.2f');
[x_r3,cdf_r3] = funcCDF(CNT_pnts, 0, deadline_N500r3, PntVal_N500Tau100r3);
plot(x_r3, cdf_r3, 'or')
hold on
PntVal_N500Tau100r5 = textread('N500Tau100r5.tr','%*s %*s %*s %*s %*s