在算法中,在每个级别中,我有两个相应的矩阵,其中一个矩阵的元素比另一个多4倍。像孩子和父母一样,但我需要有相应的元素。将以下两个索引视为级别
的示例1 5 9 13
2 6 10 14 and 1 3
3 7 11 15 2 4
4 8 12 16
所以例如,当我从第一个矩阵获得1,2,5,6个元素索引时,或者当我有3,4,7时,我希望从第二个矩阵中通过索引1接收元素,8或3为9,10,16,14等。我怎么能这样做?
作为另一个级别的另一个例子:
1 9 17 25 33 41 49 57
2 10 18 26 34 42 50 58
3 11 19 27 35 43 51 59 and 1 5 9 13
4 12 20 28 36 44 52 60 2 6 10 14
5 13 21 29 37 45 53 61 3 7 11 15
6 14 22 30 38 46 54 62 4 8 12 16
7 15 23 31 39 47 55 63
8 16 24 32 40 48 56 64
答案 0 :(得分:2)
这是一种方法:
% Size of matrix A (8x8)
sizeA = 8;
% Size of matrix B (4x4)
sizeB = 4;
% Index of element on matrix A
idxA = 43;
% That is how you can get the corresponding index on matrix B
[r, c] = ind2sub([sizeA sizeA], idxA);
idxB = sub2ind([sizeB sizeB], ceil(r / 2), ceil(c / 2))
它会给你idxB = 10
。
答案 1 :(得分:1)
reshape
可能对您有所帮助。
考虑
A = [1 5 9 13;
2 6 10 14;
3 7 11 15;
4 8 12 16];
B = reshape(permute(reshape(A, [2 2 2 2]), [2 4 1 3]), [4 4]);
B
1 2 5 6
3 4 7 8
9 10 13 14
11 12 15 16
现在,您可以很好地将索引从一个级别映射到下一个级别。
B(1,:)
对应于映射到第二个数组中元素1的所有索引等。
当矩阵变大(2n x 2n)时,操作变为
B = reshape(permute(reshape(A, [2 n 2 n]), [2 4 1 3]), [n*n 4]);
答案 2 :(得分:0)
如果您知道第一个矩阵的二维索引,那么您只需将每个矩阵除以2得到第二对索引:
r = 3;
c = 2;
% Then A(r,c) corresponds to B(floor(r/2), floor(c/2))
如果您不知道索引,而是拥有元素值本身,则必须首先找到2D索引:
val = 7; % test value
[r c] = find(A==val);
other_val = B(floor(r/2), floor(c/2));