【问题标题】:Get overlap count of column combinations获取列组合的重叠计数
【发布时间】:2013-12-31 18:49:52
【问题描述】:

我正在尝试获取所有列和列组合之间可用的所有交叉点的所有计数。

%I have a matrix of overlaps something like this : 
colHeader = {'var1','var2','var3','var4','var5'};
rowHeader = {'type1','type2','type3','type4','type5','type6','type7'};
overlap = [1,1,1,1,0;0,0,0,1,1;1,1,0,1,0;0,0,1,1,0;0,1,0,1,1;0,1,1,1,0;1,0,0,1,0];
%now i would like to get the count of overlap for all the columns variations (i.e. var1&var2 ... 
%var5&var1 at the first level, at the second level (var1&var2)&var3 etc. ) 
%the output in this case for level 1 and 2 is simple enough 
f = @(a,b) a&b
mat= zeros(5,5);
for i=1:5
    for j=1:5
       mat(i,j) = sum(f(overlap(:,i),overlap(:,j)));
    end
end
%      3     2     1     3     0
%      2     4     2     4     1
%      1     2     3     3     0
%      3     4     3     7     2
%      0     1     0     2     2
% where the diagonal is the first level of overlap and the rest are the relationships between the 
% different variables 
% i can continue in this fashion but not only is this ugly, it becomes not practical when dealing        
%with 
% bigger matrixes 
% So the problem is how to implement this for a big binary matrix in a manner that will return all 
% levels of intersection ? 

【问题讨论】:

  • +1 有趣的问题!

标签: matlab intersection overlap


【解决方案1】:
temp = 1;
for level = 1:size(overlap,2)
    temp = bsxfun(@and, temp, permute(overlap,[1 3:1+level 2]));
    result{level} = squeeze(sum(temp));
end

如何解释结果

变量result 是一个元胞数组,其中包含所有级别的结果。让 n 表示overlap 中的列数。

  • 级别 1:result{1} 是一个 1 x n 向量,它给出了 overlap 的每一列与其自身的交集(即每一列的总和)。例如,result{1}(4)overlap 的第 4 列中的个数。

  • 2 级:result{2} 是一个 n x n 矩阵。例如,result{2}(4,2)overlap 的第 4 列和第 2 列的交集。 (result{2} 在原帖中是mat)。

  • 3 级:result{3} 是一个 n x n x n 数组。例如,result{3}(4,2,5)overlap 的第 4、2 和 5 列的交集。

  • [...] 直到第 n 级。

代码的工作原理

在给定级别计算结果时,代码会使用上一级的中间结果。之所以可以这样做,是因为“与”操作是关联。例如,在级别 3,overlap(:,k) & overlap(:,m) & overlap(:,p) 可以计算为 (overlap(:,k) & overlap(:,m)) & overlap(:,p),其中 overlap(:,k) & overlap(:,m) 已在级别 2 计算(并存储)。

每个级别的最终结果 (result{level}) 将作为按列求和获得。但是,该总和之前的中间结果会被存储(变量temp),以便在下一级重用。

每个新级别从前一级别 (temp) 获取中间结果,添加一个新维度 (permute) 并计算 (bsxfun) 新中间结果(新值 temp,其中一个更多维度)。该中间结果在逐列 sum(和 squeeze 以删除单维)时给出该级别的最终结果 (result{level})。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多