计算二维矩阵的均值和标准差

时间:2015-04-01 03:35:45

标签: matlab

    x  y
    1  1.2
    1  2.3 
    1  4.5
    2  2.3
    2  1.2
    2  0.8

转换为:

 x   ymean     ystandard-deviation
 1    value       value

如何将第一个矩阵转换为第二个矩阵?

1 个答案:

答案 0 :(得分:2)

只需使用逻辑索引为每个唯一y值提取相应的x值,然后找到生成的y值的均值和标准差。

具体做法是:

x = [1 1 1 2 2 2];
y = [1.2 2.3 4.5 2.3 1.2 0.8];
y1 = y(x == 1);
y2 = y(x == 2);

m1 = mean(y1);
s1 = std(y1);
m2 = mean(y2);
s2 = std(y2);

我们得到:

>> m1

m1 =

    2.6667

>> m2

m2 =

    1.4333

>> s1

s1 =

    1.6803

>> s2

s2 =

    0.7767

m1,m2s1,s2分别是与yx = 1对应的x = 2值的均值和标准差。


通常,您可以使用accumarray根据每个唯一y值对所有x值进行分组。这样,您可以容纳x的任意数量的唯一值,而无需为x的每个唯一值使用逻辑索引。

如果x未排序,我们可以先使用unique 排序,我们会使用第一个输出包含所有唯一x值我们使用第三个输出来重新分配x的每个值,使其成为已排序的唯一ID。这些将用作accumarray的键:

[vals, ~, id] = unique(x);
m = accumarray(id, y, [], @mean);
s = accumarray(id, y, [], @std);

ms将包含x的每个唯一值的均值和标准差。此外,ms的相应位置对应vals中的相同位置。

假设我们有这个例子:

x = [1 2 3 2 4 2 1];
y = [1.2 2.3 4.5 2.3 1.2 0.8 1.6];

如果我们使用上面的代码,我们得到:

>> vals

vals =

     1     2     3     4

>> m

m =

    1.4000
    1.8000
    4.5000
    1.2000

>> s

s =

    0.2828
    0.8660
         0
         0

不要对标准差为0的最后两个条目发出警告。这是只有1点数据集的定义。 x = 3x = 4只定义了一个点。