Matlab 通过除以行和,将矩阵规格化为[0,1]中的值
我有一个矩阵总体,有8列和100行正数和负数Matlab 通过除以行和,将矩阵规格化为[0,1]中的值,matlab,normalization,Matlab,Normalization,我有一个矩阵总体,有8列和100行正数和负数 population(:,1:8) = bsxfun(@rdivide,population(:,1:8).',sum(population(:,1:8).')).'; 我想创建一个矩阵,其中每行有8个实数,满足: 所有数字都在[0,1]范围内 每行中的数字之和应等于1 我写了下面的代码。我试图对行中的数字进行规范化,但由于结果包含负数,因此无效 population(:,1:8) = bsxfun(@rdivide,population(:,1:
population(:,1:8) = bsxfun(@rdivide,population(:,1:8).',sum(population(:,1:8).')).';
我想创建一个矩阵,其中每行有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);
使用summatrix,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]
注意:在Matlab2016b中,新的隐式展开方法意味着您不需要bsxfun,只需简单地执行即可
pos = data - min(data, [], 2);
normalized = pos ./ sum(pos, 2);
@我不这么认为。更准确一点。对不起,那个评论是给伊贝齐托的,不是给你的。我有一个负数的矩阵。我想规范化那个矩阵。结果应该是正数。我认为你建议创建重复的数据文化?不是吗?对于Matlab2016b及更高版本,可以使用算术展开:矩阵。/summatrix,2@hsi您必须给出输入和所需输出的明确示例如果您希望统一分布限制为和1,请参见@Adiel element wise./事实上,感谢您发现了错误!