MATLAB:如何在没有循环的情况下为每行替换另一个值

时间:2016-03-09 03:08:36

标签: matlab matrix

我有一个由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的实际大小很大,因此想知道是否有人可以在没有循环的情况下重现它将受到高度赞赏!

1 个答案:

答案 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

现在我们只需要使用sub2indB的大小作为参考,将这些下标转换为绝对索引。

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