我有一个向量y
,可能有以下形式:
y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]
我想为y
中的每个元素附加一个概率,因为它将由随机变量生成。在这种情况下,元素1的概率为6/14,元素2的概率为4/14,元素3的值为2/14,元素4和5的值为1/14。
基本上,结果应如下所示:
prob_y = 1/14 * [6 6 6 6 4 4 4 4 6 6 2 2 1 1]
有没有办法在没有任何for
或while
循环的情况下执行此操作?
答案 0 :(得分:5)
可以使用UNIQUE函数确定输入向量中的唯一元素。然后,您可以使用ARRAYFUN和anonymous function获取所需的输出,该{{3}}检查输入向量中每个唯一元素的数量:
>> y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]; >> prob_y = arrayfun(@(x)length(find(y==x)), unique(y)) / length(y) prob_y = 0.4286 0.2857 0.1429 0.0714 0.0714
答案 1 :(得分:2)
创建一个直方图,其中包含最小和最小值之间的差异。最大元素(加1得到总范围),然后除以原始向量中的元素数进行标准化。
这样的事情:
y = [1 1 1 1 2 2 2 2 1 1 3 3 4 5]
p = hist(y, max(y) - min(y) + 1) / length(y)
[编辑] 要回答您更新的问题:使用y
从p
中选择索引,如下所示:
prob_y = p(y)
答案 2 :(得分:2)
以下是使用ACCUMARRAY的示例:
y = [1.3 1 1 1 2 2 2 2 1 1 3 3 4 5];
[g,~,gl] = grp2idx(y);
count = accumarray(g,1);
p = count(g) ./ numel(g)
概率:
>> [y(:) p]
ans =
1.3 0.071429
1 0.35714
1 0.35714
1 0.35714
2 0.28571
2 0.28571
2 0.28571
2 0.28571
1 0.35714
1 0.35714
3 0.14286
3 0.14286
4 0.071429
5 0.071429
您可以看到事件摘要为:
>> [gl count]
ans =
1 5
1.3 1
2 4
3 2
4 1
5 1
请注意,我使用GRP2IDX来处理1.3
等案例或不以1
开头的整数。