关于matlab:通过除以按行和将矩阵归一化为[0,1]中的值

Normalize matrix to values in [0,1] by dividing by row-wise sum

我有一个正数和负数的矩阵(population,有8列和100行)。

我想创建一个矩阵,其中每行有8个满足以下条件的实数:

  • 所有数字均在[0,1]范围内
  • 每行的数字总和应等于1

我写了下面的代码。我试图对行中的数字进行归一化,但由于结果包含负数,因此无法正常工作。

1
population(:,1:8) = bsxfun(@rdivide,population(:,1:8).',sum(population(:,1:8).')).';

我该如何解决?

例如,输入[1 -2 3]应该给出输出[0.375 0 0.625]


您只需要减去按行的最小值(无论它是否为负),然后除以按行的总和即可。您可以使用minsumdim自变量来指定应按行取值...

1
2
3
4
% Get positive values by subtractive the row-wise minimum
pos = bsxfun(@minus, data, min(data, [], 2));
% Normalise by dividing by the row-wise sum
normalized = bsxfun(@rdivide, pos, sum(pos,2));

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
data = [5     6     0
        6     3     2
       -1    -2     6];
pos = bsxfun(@minus, data, min(data, [], 2))
>> pos =
      [5    6    0
       4    1    0
       1    0    8]
normalized = bsxfun(@rdivide, pos, sum(pos,2))
>> normalized =
     [0.4545    0.5455         0
      0.8000    0.2000         0
      0.1111         0    0.8889]

注意:从MATLAB 2016b开始,新的隐式扩展方法意味着您不需要bsxfun,只需执行

1
2
pos = data - min(data, [], 2);
normalized = pos ./ sum(pos, 2);


您可以执行以下操作:

1
2
3
col_size = size(matrix,2);
matrix = matrix - repmat(min(matrix.').', 1, col_size); % minus minimum
normal_matrix = matrix./repmat(sum(matrix, 2), 1, col_size);

使用sum(matrix, 2)获取行总和。然后应用repmat重复此柱状矩阵,以得到具有原始矩阵大小的矩阵。然后将原始矩阵除以重复的柱状矩阵。