Domanda

Suppose there are 2 vectors (i,j), A(10,1), B(10,1) which have obtain random values from [1,10] interval. eg.

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

I am interested in creating a new vector which will count how many values with the same i index occur. e.g.

 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
...

etc.

So that a final array/vector C occurs, with all the possible pairs and their counted occurrence with size C(number_of_pairs,2).

È stato utile?

Soluzione 3

Something like this?

C = zeros(10);

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

Altri suggerimenti

Use accumarray and then 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

In your example, this gives

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

Or perhaps aa or vv are what you need; I'm not sure about what your desired output is.


Another possible approach, inspired by @Rody's answer:

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

Something like this?

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{:});

Result:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top