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

Calculate the variance of an integer vector in MATLAB

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

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

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

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

(来源:维基百科)

我使用直方图估计了 p,但后来卡住了:要以矢量化方式计算方差,我需要将 x_i 转换为 singledouble.

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

如果你愿意使用 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))

没有。方差的值很可能是浮点数,所以需要进行浮点运算。

p_i本身就是概率质量函数,所以sum(p_i)应该是1,所以每个p_i都是一个浮点数。

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