给定矩阵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]
任何想法?
答案 0 :(得分:1)
我最喜欢的三个人 - bsxfun
,permute
,reshape
提供有效且通用的解决方案 -
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