我们得到一个大小为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]
答案 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
内的线性索引。第二行计算线性索引中的行。