Matlab 根据参考矩阵和数据矩阵创建索引矩阵
给定大小为6×6的矩阵A包含数字块,每个大小为2×2的块,以及大小为2×12的外部参考矩阵R也包含数字块,每个大小为2×2的块。整个过程的目的是形成一个新的矩阵,称为索引矩阵,包含索引,根据参考矩阵R中块的顺序,这些索引表示矩阵a中块的位置。下面是一个示例 矩阵A: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 ]
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行的篇幅写了一段代码,这真是太棒了。尊敬的各位@西蒙斯哇!听到这个真是太好了!我想这个也一定很有效率!