通过除以行方和,将矩阵归一化为[0,1]中的值

时间:2017-10-24 13:26:04

标签: matlab normalization

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

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

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

我写了下面的代码。我试图规范化行中的数字,但它不起作用,因为结果包含负数。

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

我该如何解决这个问题?

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

2 个答案:

答案 0 :(得分:1)

你只需要减去行的最小值(无论它是否为负)并除以行式和。您可以使用dimmin的{​​{1}}参数来指定应逐行采用的值...

sum

例如:

% 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));

注意:从MATLAB 2016b开始, new 隐式扩展方法意味着您不需要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] ,并且可以简单地执行

bsxfun

答案 1 :(得分:0)

你可以这样做:

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重复此柱状矩阵以获得具有原始矩阵大小的矩阵。然后将原始矩阵与重复的柱状矩阵分开。