我需要计算存储为uint8
的大矢量的方差。然而,MATLAB var
函数仅接受double
和single
类型作为输入。因此,计算方差的最简单方法是
vec = randi(255,1,100,'uint8');
var(single(vec))
这当然会给出正确的结果。但是,使用single
数据类型会将内存使用量增加4倍。对于大型向量(约100万个元素),这将很快填满内存。
我尝试过:离散随机变量X的方差定义是
(来源:维基百科)
我使用直方图估算了p
,但后来陷入困境:要以矢量化方式计算方差,我需要转换x_i
' s到single
或double
。
是否有可能在不将整个矢量转换为single
或double
的情况下计算方差?
答案 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
,均值,可能不是整数