代码之家  ›  专栏  ›  技术社区  ›  RezAm

逐个矩阵赋值MATLAB

  •  1
  • RezAm  · 技术社区  · 6 年前

    我需要在矩阵“A”的每一列中找到最小值,然后用矩阵“B”的最后一行(列数相同)中的值替换这些最小值。就像我有这些:

    >> A = randi(10,10,5)
    A =
           3     5     9     5     8
           7     6     4    10     2
           8     4     1     7     4
           4     7     2     8     2
           7     5     8     7     5
           3     7    10    10     1
           5     7     8     5     7
           8     3     8     2     3
           6    10     2     1    10
           3     7     6     7     2
    >> B = randi(100,3,5)
    B =
          10    34    66    18    62
          99    95    49    54    81
          52     1    52     9    95
    >> [M,I] = min(A)
        M =
             3     3     1     1     1
        I =
             1     8     3     9     6
    

    我想将“M”的值替换为“B(end,:”,这样:

    A(1,1) = B(end,1);
    A(8,2) = B(end,2);
    A(3,3) = B(end,3);
    A(9,4) = B(end,4);
    A(6,5) = B(end,5);
    

    我试着 "A(I) = B(end,:)" "A(I(1,:)) = B(end,:)" 但它们不起作用!你知道我该怎么做吗?我的真实矩阵是巨大的(1200x100000),所以无法手动完成!

    2 回复  |  直到 6 年前
        1
  •  5
  •   Hunter Jiang    6 年前

    尝试此项以替换 第一个最小值 :

    A = [  3     5     9     5     8;
           7     6     4    10     2;
           8     4     1     7     4;
           4     7     2     8     2;
           7     5     8     7     5;
           3     7    10    10     1;
           5     7     8     5     7;
           8     3     8     2     3;
           6    10     2     1    10;
           3     7     6     7     2];
    B =[  10    34    66    18    62;
          99    95    49    54    81;
          52     1    52     9    95];
    
    [M,I] = min(A)
    A(sub2ind(size(A),I,1:size(A,2)))=B(end,:)
    

    输出将为:

    A =
    
        52     5     9     5     8
         7     6     4    10     2
         8     4    52     7     4
         4     7     2     8     2
         7     5     8     7     5
         3     7    10    10    95
         5     7     8     5     7
         8     1     8     2     3
         6    10     2     9    10
         3     7     6     7     2
    

    但是,当您必须更换 所有最小值 ,请改用下面的代码

    A = [  3     5     9     5     8;
           7     6     4    10     2;
           8     4     1     7     4;
           4     7     2     8     2;
           7     5     8     7     5;
           3     7    10    10     1;
           5     7     8     5     7;
           8     3     8     2     3;
           6    10     2     1    10;
           3     7     6     7     2];
    B =[  10    34    66    18    62;
          99    95    49    54    81;
          52     1    52     9    95];
    
    M = min(A);    
    for i=1:size(A,2)
      A(find(A(:,i) == M(i)),i)=B(end,i);
    end;
    A
    

    输出为:

    A =
    
        52     5     9     5     8
         7     6     4    10     2
         8     4    52     7     4
         4     7     2     8     2
         7     5     8     7     5
        52     7    10    10    95
         5     7     8     5     7
         8     1     8     2     3
         6    10     2     9    10
        52     7     6     7     2
    
        2
  •  2
  •   Kai Do    6 年前

    您可以通过单个索引访问矩阵,如下所示:

    Indeces =
              1  6 11 16 
              2  7 12 17 
              3  8 13 18 
              4  9 14 19 
              5 10 15 20 
    

    由于您可以获得每个列的索引,因此只需将其增加列数乘以矩阵的高度即可。
    这将产生正确的结果:

    A( I + (0 : size(A,2)-1) * size(A,1) ) = B(end,:)