Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB:如何在没有循环的情况下,将每行的值替换为另一个值_Matlab_Matrix - Fatal编程技术网

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

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'

我有一个由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' 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