MATLAB:如何在没有循环的情况下,将每行的值替换为另一个值
我有一个由12和3组成的矩阵a,例如MATLAB:如何在没有循环的情况下,将每行的值替换为另一个值,matlab,matrix,Matlab,Matrix,我有一个由12和3组成的矩阵a,例如 A= [ 1 2 2 1; 3 3 1 2; ... ... 1 1 2 2] 现在,我想用B中不同的值来替换1 2 3,根据它的行。e、 g B= [ 4 5 6; 10 20 30; ... ... 77 88 99] 我想将每行中A到B中的值替换。e、 g A= [ 1 2 2 1; replace '1 2 3' with '4 5 6'
A= [ 1 2 2 1;
3 3 1 2;
...
...
1 1 2 2]
现在,我想用B中不同的值来替换1 2 3,根据它的行。e、 g
B= [ 4 5 6;
10 20 30;
...
...
77 88 99]
我想将每行中A到B中的值替换。e、 g
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的实际大小都很大,因此我想知道是否有人可以在没有循环的情况下复制它,我将不胜感激
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
中的行相同。因此,我们只需要为a
的每个成员创建一个到B
的行和列索引
为了得到行,我们只需要创建一个大小为a
的矩阵,其中每行中的每个元素都等于行索引。此外,我们还注意避免任何幻数,并实际确定正确的大小
rowindex = repmat(1:size(A, 1), size(A, 2), 1).'
1 1 1 1
2 2 2 2
3 3 3 3
太好了,现在我们已经知道了,我们已经知道了专栏。这简直就是一个
colindex = A
1 2 2 1
3 3 1 2
1 1 2 2
现在我们只需要使用和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