箱相互作用频率

时间:2019-03-21 13:07:27

标签: matlab

我有10个垃圾箱,每个垃圾箱包含一定数量的观测值,例如:

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

我希望随后根据观察次数计算任何给定的一对(非零)垃圾箱共发生多少次。

给出以上示例bin#3 = 1bin#6 = 2bin#10 = 2

这意味着bin 3和6共存一次,bin 3和10共存一次,bin 6和10共存两次(取该对的最小值)。

我想要的输出是一个完整的矩阵,列出每个可能的bin组合(第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 个答案:

答案 0 :(得分:1)

尝试一下。

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

答案 1 :(得分:1)

您可以在many ways中获得垃圾箱编号的所有组合。为方便起见,我将使用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 );