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
如何将第一个矩阵转换为第二个矩阵?
答案 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,m2
和s1,s2
分别是与y
和x = 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);
m
和s
将包含x
的每个唯一值的均值和标准差。此外,m
和s
的相应位置对应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 = 3
和x = 4
只定义了一个点。