Matlab 根据参考矩阵和数据矩阵创建索引矩阵

Matlab 根据参考矩阵和数据矩阵创建索引矩阵,matlab,Matlab,给定大小为6×6的矩阵A包含数字块,每个大小为2×2的块,以及大小为2×12的外部参考矩阵R也包含数字块,每个大小为2×2的块。整个过程的目的是形成一个新的矩阵,称为索引矩阵,包含索引,根据参考矩阵R中块的顺序,这些索引表示矩阵a中块的位置。下面是一个示例 矩阵A: A =[1 1 2 2 3 3; 1 1 2 2 3 3; 1 1 3 3 4 4; 1 1 3 3 4 4; 4 4 5 5 6 6; 4 4 5 5 6 6 ]

给定大小为6×6的矩阵A包含数字块,每个大小为2×2的块,以及大小为2×12的外部参考矩阵R也包含数字块,每个大小为2×2的块。整个过程的目的是形成一个新的矩阵,称为索引矩阵,包含索引,根据参考矩阵R中块的顺序,这些索引表示矩阵a中块的位置。下面是一个示例

矩阵A:

A  =[1 1 2 2 3 3; 

     1 1 2 2 3 3;

     1 1 3 3 4 4;

     1 1 3 3 4 4;

     4 4 5 5 6 6;

     4 4 5 5 6 6 ]
矩阵R:

R=[1 1 2 2  3 3 4 4 5 5 6 6;

   1 1 2 2  3 3 4 4 5 5 6 6 ]
新矩阵为:

Index =[1 2 3;

        1 3 4;

        4 5 6]

有什么想法吗?

和我最喜欢的三个人一起,寻找一个高效的通用解决方案-

blksz = 2;                       %// blocksize
num_rowblksA = size(A,1)/blksz;  %// number of blocks along rows in A

%// Create blksz x blksz sized blocks for A and B
A1 = reshape(permute(reshape(A,blksz,num_rowblksA,[]),[1 3 2]),blksz^2,[])
R1 = reshape(R,blksz^2,1,[])

%// Find the matches with "bsxfun(@eq" and corresponding indices
[valid,idx] = max(all(bsxfun(@eq,A1,R1),1),[],3)
%// Or with PDIST2: 
%// [valid,idx] = max(pdist2(A1.',reshape(R,blksz^2,[]).')==0,[],2)
idx(~valid) = 0

%// Reshape the indices to the shapes of blocked shapes in A
Index = reshape(idx,[],num_rowblksA).'
具有更多随机输入的示例运行-

>> A
A =
     2     1     1     2
     1     2     2     1
     1     1     1     1
     2     2     2     2
     1     2     2     1
     1     2     1     1
>> R
R =
     2     1     1     1     1     2     2     2     1     1     1     1
     2     1     2     1     1     2     2     1     2     2     2     1
>> Index
Index =
     0     0
     5     5
     3     0

非常感谢你,我用30到7行的篇幅写了一段代码,这真是太棒了。尊敬的各位@西蒙斯哇!听到这个真是太好了!我想这个也一定很有效率!