关于Matlab:计算二维矩阵的均值和标准差

Compute mean and standard deviation in 2-d matrix

1
2
3
4
5
6
7
    x  y
    1  1.2
    1  2.3
    1  4.5
    2  2.3
    2  1.2
    2  0.8

转换成 :

1
2
 x   ymean     ystandard-deviation
 1    value       value

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


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

特别:

1
2
3
4
5
6
7
8
9
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);

我们得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>> m1

m1 =

    2.6667

>> m2

m2 =

    1.4333

>> s1

s1 =

    1.6803

>> s2

s2 =

    0.7767

m1,m2s1,s2是分别对应于x = 1x = 2y值的平均值和标准偏差。

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

x未排序的情况下,我们可以首先使用unique对其进行排序,其中我们使用的第一个输出包含所有唯一的x值,而我们使用第三个输出将x的每个值重新分配为已排序的唯一ID。这些将用作accumarray的键:

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

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

假设我们有以下示例:

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

如果使用上面的代码,则会得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>> 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都只定义了一个点。