通过除以逐行总和将矩阵归一化为 [0,1] 中的值
Normalize matrix to values in [0,1] by dividing by row-wise sum
我有一个由正数和负数组成的矩阵(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]
您可以按照以下方式进行操作:
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
重复这个柱状矩阵,得到一个与原始矩阵大小相同的矩阵。然后将原始矩阵除以重复的柱状矩阵。
您只需减去行最小值(无论它是否为负数)并除以行总和。您可以使用 min
和 sum
的 dim
参数来指定应该按行取值...
% 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));
例如:
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 开始,new 隐式扩展方法意味着您不需要 bsxfun
,只需执行
pos = data - min(data, [], 2);
normalized = pos ./ sum(pos, 2);
我有一个由正数和负数组成的矩阵(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]
您可以按照以下方式进行操作:
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
重复这个柱状矩阵,得到一个与原始矩阵大小相同的矩阵。然后将原始矩阵除以重复的柱状矩阵。
您只需减去行最小值(无论它是否为负数)并除以行总和。您可以使用 min
和 sum
的 dim
参数来指定应该按行取值...
% 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));
例如:
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 开始,new 隐式扩展方法意味着您不需要 bsxfun
,只需执行
pos = data - min(data, [], 2);
normalized = pos ./ sum(pos, 2);