我有10个垃圾箱,每个垃圾箱包含一定数量的观测值,例如:
a = [0,0,1,0,0,2,0,0,0,2]
我希望随后根据观察次数计算任何给定的一对(非零)垃圾箱共发生多少次。
给出以上示例bin#3 = 1
,bin#6 = 2
和bin#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
是否有简短和/或快速的方法?
答案 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 );