Частоты взаимодействия бин - PullRequest
1 голос
/ 21 марта 2019

У меня есть 10 корзин, и каждая корзина содержит определенное количество наблюдений, например ::1001

a = [0,0,1,0,0,2,0,0,0,2]

Я бы хотел впоследствии подсчитать, сколько раз будет встречаться любая заданная пара (ненулевых) бинов - исходя из количества наблюдений.

Учитывая приведенный выше пример, bin#3 = 1, bin#6 = 2 и bin#10 = 2.

Это означает, что приемник 3 и 6 произошел одновременно, приемник 3 и 10 произошел один раз, а приемник 6 и 10 произошел дважды (взято минимальное значение пары).

Мой желаемый результат - полная матрица, перечисляющая каждую возможную комбинацию бинов (столбцы 1-2) и подсчет того, что наблюдалось (столбец 3):

1   2   0
1   3   0
1   4   0
1   5   0
1   6   0
1   7   0
1   8   0
1   9   0
1   10  0
2   3   0
2   4   0
2   5   0
2   6   0
2   7   0
2   8   0
2   9   0
2   10  0
3   4   0
3   5   0
3   6   1
3   7   0
3   8   0
3   9   0
3   10  1
4   5   0
4   6   0
4   7   0
4   8   0
4   9   0
4   10  0
5   6   0
5   7   0
5   8   0
5   9   0
5   10  0
6   7   0
6   8   0
6   9   0
6   10  2
7   8   0
7   9   0
7   10  0
8   9   0
8   10  0
9   10  0

Есть ли короткий и / или быстрый способ сделать это?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Вы можете получить все комбинации номеров бинов в разными способами . Я буду использовать combvec для удобства.

Тогда это относительно просто векторизовать, используя min ...

a = [0,0,1,0,0,2,0,0,0,2];

n = 1:numel(a);
% Use unique and sort to get rid of duplicate pairs when order doesn't matter
M = unique( sort( combvec( n, n ).', 2 ), 'rows' ); 
% Get rid of rows where columns 1 and 2 are equal
M( M(:,1) == M(:,2), : ) = [];
% Get the overlap count for bins
M( :, 3 ) = min( a(M), [], 2 );
1 голос
/ 21 марта 2019

Попробуйте это.

bin_output = [....];
bin_matrix = [0,0,1,0,0,2,0,0,0,2];
bin_nonzero = find(bin_matrix);
for j = 1:length(bin_nonzero);
    if isequal(j,length(bin_nonzero))
        break;
    end
    for k = (j+1):(length(bin_nonzero))
        for m = 1:length(bin_output)
            if isequal(bin_output(m,1),j) && isequal(bin_output(m,2),k)
                bin_output(m,3) = bin_output(m,3) + min([bin_matrix(1,bin_nonzero(1,j)),bin_matrix(1,bin_nonzero(1,k))]);
            end
        end
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...