在MATLAB中计算整数向量的方差

时间:2015-02-12 09:25:40

标签: matlab integer

我需要计算存储为uint8的大矢量的方差。然而,MATLAB var函数仅接受doublesingle类型作为输入。因此,计算方差的最简单方法是

vec = randi(255,1,100,'uint8');
var(single(vec))

这当然会给出正确的结果。但是,使用single数据类型会将内存使用量增加4倍。对于大型向量(约100万个元素),这将很快填满内存。

我尝试过:离散随机变量X的方差定义是

Definition(来源:维基百科)

我使用直方图估算了p,但后来陷入困境:要以矢量化方式计算方差,我需要转换x_i' s到singledouble

是否有可能在不将整个矢量转换为singledouble的情况下计算方差?

2 个答案:

答案 0 :(得分:3)

如果你愿意使用uint16,你可以这样做,它只创建3个浮点数(var和2表示),使用Var(X)= Mean(X ^ 2)-Mean( X)^ 2:

uivec=uint16(vec);
mean(uivec.^2)-mean(uivec)^2

所以,不如保持uint8好,但仍然比转换为单身好两倍。它应该与uint16一起使用,因为你的输入是uint8和(2 ^ 8)^ 2 = 2 ^ 16。

如果你想要与var完全相同的答案,你需要记住MATLAB使用var的无偏估计(它将总和除以n-1而不是n,其中n是你的样本数量)所以你需要这样做:

n=length(vec);
v=mean(uivec.^2)-mean(uivec)^2*(n/(n-1))

然后您的v将完全等于var(single(vec))

答案 1 :(得分:1)

没有。方差的值最有可能是浮点值,因此您需要执行浮点运算。

p_i本身就是概率质量函数,因此sum(p_i)应为1,因此每个p_i都是浮点数。

此外,nu,均值,可能不是整数