基于单元数组matlab的行号创建索引矩阵

时间:2015-04-17 12:50:49

标签: matlab

我们得到一个大小为m x n的单元格数组Ref_M,以及一个大小为L x C的矩阵IMG。 目的是将IMG矩阵拆分为2x2块,然后创建一个新矩阵IMG_New,其中包含引用该块所属Ref_M中哪一行的数字。

假设:

Ref_M = [1 1; 1 1]    [2 2; 2 2]    [ 9 9; 9 9]
        [3 3; 3 3]    [5 5; 5 5]    [] 
        [6 6; 6 6]    [4 4; 4 4]    []
        [7 7; 7 7]    []            []

IMG =[1 1 2 2 2 2 5 5;
      1 1 2 2 2 2 5 5;
      4 4 5 5 6 6 9 9;
      4 4 5 5 6 6 9 9;
      3 3 9 9 1 1 7 7;
      3 3 9 9 1 1 7 7]

IMG的第一个块是:

1 1
1 1

现在我们需要定义该块所属的Ref_M中的哪一行,并且我们可以看到它属于第一行,因此IMG_New的第一个元素应该是1

IMG_New = [1]

IMG的第二个块是:

2 2
2 2

现在我们需要定义该块所属的Ref_M中的哪一行,并且我们可以看到它也属于第一行,因此IMG_New的第二个元素应该是1也

IMG_New = [1 1]

关于第三块的事情

2 2
2 2

它来自第四个街区:

5 5
5 5

我们需要定义该块所属的Ref_M中的哪一行,并且我们可以看到它也属于第二行,因此IMG_New的第4个元素应为2

IMG_New = [1 1 1 2]

等等

totlal结果应为:

IMG_New = [1 1 1 2;
           3 2 3 1;
           2 1 1 4]

1 个答案:

答案 0 :(得分:1)

您可以将blockproc与自定义功能结合使用:

ind = blockproc(IMG.', [2 2], @(x) find(cellfun(@(y) isequal(x.data.', y), Ref_M), 1)).';
IMG_new = mod(ind-1, size(Ref_M,1))+1;

注意:

    第一行中的
  • [2 2]是所需的块大小。
  • 这会在Ref_M中找到第一个匹配项(如果有多个匹配项)。
  • 匿名函数@(x) ...确定IMG的每个块的第一个匹配项。它使用cellfun来完成实际工作。
  • ind包含Ref_M内的线性索引。第二行计算线性索引中的行。