matlab方差方差

时间:2011-02-11 12:20:09

标签: matlab angle atan2

我有一个包含角度的矩阵,我需要计算均值和方差。 对于我这样做的意思: 对于每个角度计算sin和cos并求和所有sin和所有cos 平均值由atan2(sin,cos)给出 它的工作原理 我的问题是如何计算知道平均值的角度方差?

谢谢你的回答

我附上了我的matlab代码:

for i=1:size(im2,1)

    for j=1:size(im2,2)
        y=y+sin(hue(i, j));
        x=x+cos(hue(i, j));
    end
end
mean=atan2(y, x);

if mean<0

    mean=mean+(2*pi);
end

4 个答案:

答案 0 :(得分:3)

我不是100%肯定你在做什么,但也许这会在MATLAB函数meanvar中构建同样的东西。

>> [file path] = uigetfile;
>> someImage = imread([path file]);
>> hsv = rgb2hsv(someImage);
>> hue = hsv(:,:,1);
>> m = mean(hue(:))

m =

    0.5249

>> v = var(hue(:))

v =

    0.2074

编辑:我假设您有一个图片,因为您的变量名为hue。但对于任何矩阵都是一样的。

编辑2:也许这就是你要找的东西:

>> sumsin = sum(sin(hue(:)));
>> sumcos = sum(cos(hue(:)));
>> meanvalue = atan2(sumsin,sumcos)

meanvalue =

    0.5276

>> sumsin = sum(sin((hue(:)-meanvalue).^2));
>> sumcos = sum(cos((hue(:)-meanvalue).^2));
>> variance = atan2(sumsin,sumcos)

variance =

    0.2074

答案 1 :(得分:3)

为了计算角度的方差,您不能使用标准方差。这是计算角度变量的公式

R = 1 - sqrt((sum(sin(angle)))^ 2 +(sum(cos(angle)))^ 2)/ n; 还有类似的其他配方 var(angle)= var(sin(angle))+ var(cos(angle));

价: http://www.ebi.ac.uk/thornton-srv/software/PROCHECK/nmr_manual/man_cv.html

答案 2 :(得分:2)

圆形数据的方差不能被视为实线上无界数据的方差。 (对于非常小的方差,它们实际上是等价的,但是对于大的方差,等价性会崩溃。应该清楚为什么会这样。)我建议N.I. 循环数据的统计分析。费舍尔。本书包含一个广泛使用的圆形方差定义,它是根据与角度对应的单位矢量的平均合成长度计算出来的。

>> sumsin = sum(sin((hue(:)-meanvalue).^2));
>> sumcos = sum(cos((hue(:)-meanvalue).^2));

错了。你无法减去这样的角度。

顺便说一句,这个问题确实与MATLAB无关。您可以在statistics stack exchange

上发布更多/更好的答案

答案 3 :(得分:0)

我们遇到了同样的问题,在 python 中,我们可以使用 scipy.cirvar 来解决这个问题,它计算假设在一个范围内的样本的循环方差。例如:

from scipy.stats import circvar
circvar([0, 2*np.pi/3, 5*np.pi/3])
# 2.19722457734

circvar([0, 2*np.pi])
# -0.0

建议的 MATLAB 代码的问题是 [0, 6.28] 的方差应该为零。通过查看 scipy.circvar 的实现,它就像:


# Recast samples as radians that range between 0 and 2 pi and calculate the sine and cosine
samples, sin_samp, cos_samp, nmask = _circfuncs_common(samples, high, low)

sin_mean = sin_samp.mean()
cos_mean = cos_samp.mean()

R = np.minimum(1, hypot(sin_mean, cos_mean))
circular_variance = ((high - low)/2.0/pi)**2 * -2 * np.log(R)