我有一个由1 2和3组成的矩阵A,例如,
A= [ 1 2 2 1;
3 3 1 2;
...
...
1 1 2 2]
现在我想根据它的行用B中的不同值替换1 2 3。例如,
B= [ 4 5 6;
10 20 30;
...
...
77 88 99]
我想在每行中将A中的值替换为B.如,
A= [ 1 2 2 1; replace '1 2 3' with '4 5 6' respectively
3 3 1 2; replace '1 2 3' with '10 20 30' respectively
...
...
1 1 2 2] replace '1 2 3' with '77 88 99' respectively
C将是具有我想要的新分配的矩阵。
C= [ 4 5 5 4;
30 30 10 20;
...
...
77 77 88 88]
在这种情况下,我无法避免循环,这是我能做的最快捷的方式:
for row_i=1:size(A,1)
C(row_i,:)=B(row_i,A(row_i,:))
end
我讨厌MATLAB中的循环,A和B的实际大小很大,因此想知道是否有人可以在没有循环的情况下重现它将受到高度赞赏!
答案 0 :(得分:0)
A = [ 1 2 2 1;
3 3 1 2;
1 1 2 2];
B = [ 4 5 6;
10 20 30;
77 88 99];
C = B(sub2ind(size(col), repmat(1:size(A, 1), size(A, 2), 1).', A));
4 5 5 4
30 30 10 20
77 77 88 88
<强>解释强>
您正在使用A
来指明要使用的B
列。正如您所说,您希望该行与A
中的行相同。因此,对于B
的每个成员,我们只需要A
的行和列索引。
要获取行,我们只需要创建一个大小为A
的矩阵,其中每行中的每个元素都等于行索引。此外,我们注意避免任何神奇的数字,并实际确定适当的大小。
rowindex = repmat(1:size(A, 1), size(A, 2), 1).'
1 1 1 1
2 2 2 2
3 3 3 3
很好,既然我们已经拥有了,我们已经知道列。这只是A
!
colindex = A
1 2 2 1
3 3 1 2
1 1 2 2
现在我们只需要使用sub2ind
和B
的大小作为参考,将这些下标转换为绝对索引。
indices = sub2ind(size(B), rowindex, colindex)
1 4 4 1
8 8 2 5
3 3 6 6
现在我们只需要使用这些索引编入B
并分配给C
。
C = B(indices)
4 5 5 4
30 30 10 20
77 77 88 88