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