查找一对值出现的次数

时间:2014-02-10 12:46:09

标签: matlab montecarlo

假设有2个向量(i,j)A(10,1)B(10,1)[1,10]区间获取随机值。例如。

A = [1 6 1 10 1 7 1 9  3 6]
B = [7 2 3  5 6 8 7 9 10 2].

我有兴趣创建一个新的向量,它将计算出具有相同i索引的值的数量。例如

 1 and 7 ⇒ 2 occurrences
 6 and 2 ⇒ 2 occurrences
 1 and 3 ⇒ 1 occurrence
10 and 5 ⇒ 1 occurrence
 1 and 6 ⇒ 1 occurrence
...

这样就会出现一个最终的数组/向量C,包含所有可能的对及其计数出现的大小C(number_of_pairs,2)

3 个答案:

答案 0 :(得分:3)

使用accumarray然后find

A = [1 6 1 10 1 7 1 9  3 6];
B = [7 2 3  5 6 8 7 9 10 2]; %// data

aa = accumarray([A(:) B(:)], 1); %// how many times each pair occurs
[ii jj vv] = find(aa);
C = [ii jj vv]; %// only pairs which occurr at least once

在你的例子中,这给出了

C =
     6     2     2
     1     3     1
    10     5     1
     1     6     1
     1     7     2
     7     8     1
     9     9     1
     3    10     1

或者aavv或许是你需要的;我不确定你想要的输出是什么。


另一种可能的方法,受@Rody's answer的启发:

mat = [A(:) B(:)];
[bb ii jj] = unique(mat, 'rows');
C = [mat(ii,:) accumarray(jj,1)];

答案 1 :(得分:2)

这样的东西?

A = [1 6 1 10 1 7 1 9  3 6];
B = [7 2 3  5 6 8 7 9 10 2];

%// Find the unique pairs
AB  = [A;B].';
ABu = unique(AB, 'rows');

%// Count the number of occurrences of each unique pair
%// (pretty sure there's a better way to do this...)     
C = arrayfun(@(ii) ...
    [ABu(ii,:) sum(all(bsxfun(@eq, AB, ABu(ii,:)),2))], 1:size(ABu,1), ...
    'UniformOutput', false);
C = cat(1,C{:});

结果:

C =
     1     3     1
     1     6     1
     1     7     2
     3    10     1
     6     2     2
     7     8     1
     9     9     1
    10     5     1

答案 2 :(得分:1)

这样的东西?

C = zeros(10);

for k = 1:10
    C(A(k), B(k)) = C(A(k), B(k)) + 1
end