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 |
如何将第一个矩阵转换为第二个矩阵?
-
我不遵循您实际要计算的内容。 您是否要计算均值和标准差。 开发。 y的值? 还不清楚您想要什么。
-
是对应于每个x值
只需使用逻辑索引为每个唯一的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,m2和s1,s2是分别对应于x = 1和x = 2的y值的平均值和标准偏差。
通常,可以使用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); |
m和s将包含每个x唯一值的平均值和标准偏差。同样,m和s的对应位置与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 = 3和x = 4都只定义了一个点。
-
谢谢! 考虑一种情况,其中x未排序,例如 1 2 3 2 4 2 1.您将如何获得相应的x数组。
-
@AbhishekBhatia-太简单了。 让我修改我的答案。
-
@AbhishekBhatia-完成。 检查我的修改。 我可以将答案与accumarray结合使用,以使其更加灵活。
-
大! 谢谢您的详细回答。
-
@AbhishekBhatia-没问题:)祝你好运!