逐个矩阵分配MATLAB

时间:2018-02-06 04:46:41

标签: matlab min assign

我需要找到矩阵" 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(结束,:),以便:

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

答案 0 :(得分: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 =[  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

答案 1 :(得分:2)

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

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

由于您获得了每个列的indeces,您只需要按列号乘以矩阵的高度来增加它。
这应该产生正确的结果:

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