50 lines
1.2 KiB
Text
50 lines
1.2 KiB
Text
>type median
|
|
function median (x, v: none, p)
|
|
|
|
## Default for v : none
|
|
## Default for p : 0.5
|
|
|
|
m=rows(x);
|
|
if m>1 then
|
|
y=zeros(m,1);
|
|
loop 1 to m;
|
|
y[#]=median(x[#],v,p);
|
|
end;
|
|
return y;
|
|
else
|
|
if v<>none then
|
|
{xs,i}=sort(x); vsh=v[i];
|
|
n=cols(xs);
|
|
ns=sum(vsh);
|
|
i=1+p*(ns-1); i0=floor(i);
|
|
vs=cumsum(vsh);
|
|
loop 1 to n
|
|
if vs[#]>i0 then
|
|
return xs[#];
|
|
elseif vs[#]+1>i0 then
|
|
k=#+1;
|
|
repeat;
|
|
if vsh[k]>0 or k>n then break; endif;
|
|
k=k+1;
|
|
end;
|
|
return (1-(i-i0))*xs[#]+(i-i0)*xs[k]+0;
|
|
endif;
|
|
end;
|
|
return xs[n];
|
|
else
|
|
xs=sort(x);
|
|
n=cols(x);
|
|
i=1+p*(n-1); i0=floor(i);
|
|
if i0==n then return xs[n]; endif;
|
|
return (i-i0)*xs[i+1]+(1-(i-i0))*xs[i];
|
|
endif;
|
|
endif;
|
|
endfunction
|
|
>median(1:10)
|
|
5.5
|
|
>median(1:9)
|
|
5
|
|
>median(1:10,p=0.2)
|
|
2.8
|
|
>0.2*10+0.8*1
|
|
2.8
|