MATLAB:计算B行中A行的出现次数

时间:2014-03-31 08:35:42

标签: arrays matlab

考虑2个矩阵A,B,其中A是21x2矩阵,B是35x3矩阵

 A = [ 1 2 ;                  B = [ 1 2 3 ;
       1 3 ;                        1 2 4 ; 
       1 4 ;                        .
       .                            .
       .                            .
       .                            5 6 7]
       6 7 ]                          

我有矢量count_Acount_B

  • count_A是一个21 x 1向量,对A
  • 的每一行都有一个标量。
  • 类似地,count_B35 x 1向量。

我需要浏览B并找到比率count_B/count_A,它会读取B每行的前2个元素,并从count_A调用相应的计数。我们还需要获取该行的count_B值,并为B中的每一行提供比率。


示例:

 count_A = [ 2 ;                count_B = [ 1 ;
             3 ;                            2 ;
             .                              .
             .                              . 
             .                              .
             2 ]                            3 ]

输出应如下:

  • 第一行:count([1,2,3]) / count([1,2])1/2

  • 第二行:count([1,2,4]) / count([1,2])2/2 = 1

    ...

  • 第35行:count([5,6,7]) / count([5,6])

我的意思count([1,2,3]) count_B[1,2,3]count([1,2])count_A[1,2]的回应。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

你的问题不明确。以下是 title 要求的内容。

countA = sum(squeeze(all(bsxfun(@eq, B(:,1:2).', permute(A, [2 3 1])))));
countB = sum(squeeze(all(bsxfun(@eq, A.', permute(B(:,1:2), [2 3 1])))));

示例:

A = [ 1 2                  
      1 3                 
      1 4 
      6 7 ];

B = [ 1 2 3
      1 2 4
      1 3 5
      5 6 7 ];

countA =
     2     1     0     0

countB =
     1     1     1     0

答案 1 :(得分:0)

我不完全确定你问的是什么,所以让我先从一些假设开始:

  1. 您的矩阵AB分别有2个和3个元素。每行都是唯一的,因此例如[2, 3]中最多只会出现A一次。

  2. 当您说count([1, 2])时,您的真正含义是count_A[1, 2]A位于同一行的值A = [1 2; 1 3; 1 4; 6 7]; B = [1 2 3; 1 2 4; 1 3 5; 6 7 8]; count_A = [2 3 2 5]'; count_B = [1 2 3 4]'; ratio = zeros(size(count_B)); for Bidx = 1:size(B,1) % See http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix [~, Aidx] = ismember(B(Bidx, 1:2), A, 'rows'); if Aidx > 0 % ismember returns 0 if not found ratio(Bidx) = count_A(Aidx) / count_B(Bidx); end end ratio

  3. 您可以通过一些智能搜索技巧轻松完成此任务:

    ratio =
    
        2.0000
        1.0000
        1.0000
        1.2500
    

    现在,我的输出是

    ismember

    这是你要求的吗?

    注意:我无法保证{{1}}的性能,因此如果您有非常多的行,这可能会非常慢。如果需要,可以测试小样本的正确性。

答案 2 :(得分:0)

检查此bsxfun方法 -

A = [1 2; 1 3; 1 4; 6 7;5 6]
B = [1 2 3; 1 2 4; 1 3 5; 6 7 8;6 7 4; 6 7 7;5 6 7]
count_A = [2 3 2 5 2]';
count_B = [1 2 3 4 3 5 7]';

matches = bsxfun(@eq,A,permute(B(:,1:2),[3 2 1]))
[x1,y1] = find(reshape(all(matches,2),size(A,1),size(B,1)))
out = count_B./count_A(x1)

输出 -

out =

    0.5000
    1.0000
    1.0000
    0.8000
    0.6000
    1.0000
    3.5000

希望这就是你所追求的。