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]
您只需要减去按行的最小值(无论它是否为负),然后除以按行的总和即可。您可以使用min和sum的dim自变量来指定应按行取值...
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重复此柱状矩阵,以得到具有原始矩阵大小的矩阵。然后将原始矩阵除以重复的柱状矩阵。
- @hsi我不这么认为。更加精确。
-
很抱歉,该评论适用于lbezito,不适用于您。
-
我有负数的矩阵。我想规范化那个matrix.result应该有正数。我认为您的建议会产生重复的数据量?不是?
-
对于Matlab 2016b及更高版本,您可以使用算术扩展:matrix./sum(matrix,2)
-
@hsi,您必须给出输入和所需输出的明确示例
-
我有一个矩阵。这是不规范的。其中一些数据是负面的。它是代码的输入。该矩阵的每一行都应在[0,1]中具有正归一化数。并且每行的数字总和应等于1。
-
这不是一个例子。我不知道通过标准化负值和正值意味着什么...看@wolfie的评论
-
输入为负数。您的建议代码是否为正数?我想要结果为正数。
-
一排矩阵的示例=>输入:1 -2 3,输出:0.375 0 0.625
-
[-3 5]和[0 0 0]的结果是什么?
-
我使用此代码而不是有问题的代码,但总和不等于1.我的代码是:人口=零(100,8);人口= rand(100,8);对于ii = 1:大小(人口,1)人口(ii,:) =(人口(ii,:)-min(人口(ii,:))))/(max(人口(ii,:))-min(人口(ii,:)))/(总和(人口(ii,:))));结尾
-
再次@hsi。我的代码是不同的。您已经写好了Ibezito的答案。