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

时间:2015-03-09 06:30:28

标签: matlab

给定矩阵A的大小为6乘6包含数字块,每个块大小为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]

任何想法?

1 个答案:

答案 0 :(得分:1)

我最喜欢的三个人 - bsxfunpermutereshape提供有效且通用的解决方案 -

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