2015-04-01 78 views
0
x y 
    1 1.2 
    1 2.3 
    1 4.5 
    2 2.3 
    2 1.2 
    2 0.8 

转换为:计算均值和中2-d矩阵标准偏差

x ymean  ystandard-deviation 
1 value  value 

我如何能在第一矩阵转换为第二?

+0

我不关注你真正想要计算的东西。你想计算均值和标准。开发。 'y'值?这是不是很清楚你想要什么。 – rayryeng 2015-04-01 03:39:45

+0

是对应于每个x值 – 2015-04-01 03:46:00

回答

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是装置和分别相应于和x = 1x = 2y的标准偏差。


在一般情况下,你可以使用accumarray到组根据每个独特x值全部y值。这样,您可以容纳多个唯一值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 

不要与具有标准偏差的最后两个条目惊慌当你只有一个由1个点组成的数据集时,这就是定义。对于x = 3x = 4只定义了一个点。

+0

谢谢!考虑x未排序例如1 2 3 2 4 2 1.你将如何获得相应的x数组。 – 2015-04-01 04:10:24

+0

@AbhishekBhatia - 很简单。让我修改我的答案。 – rayryeng 2015-04-01 04:19:44

+0

@AbhishekBhatia - 完成。检查我的编辑。我会用'accumarray'来回答这个问题,以使它更加灵活。 – rayryeng 2015-04-01 04:24:58