我应该如何在Matlab中对和为1的向量进行归一化?

dra*_*mnl 9 matlab normalize norm

我需要规范化N个整数的向量,以便:

  • 每个值与其原始值成比例(该值将介于0和1之间)
  • 所有值的总和为= 1

例如:

如果我有一个矢量

V = [2,2,1,0]
Run Code Online (Sandbox Code Playgroud)

规范化的矢量应该是:

V_norm = [0.4,0.4,0.2,0]  % 0.4+0.4+0.2 = 1
Run Code Online (Sandbox Code Playgroud)

我尝试了在这个社区和网络上找到的许多解决方案,最后我用这个代码做了:

part = norm(V);
if part > 0
  V_norm = V/part;
else % part = 0 --> avoid "divide by 0" 
  V_norm = part;
end
Run Code Online (Sandbox Code Playgroud)

这有效的问题如果:

  • 数组的所有元素都是"0" - >结果数组不会改变
  • 只有一个数组元素> 0而所有其他元素都是= 0 - >结果数组:元素> 0是1而另一个0

但如果我有不同的情况,虽然结果是成比例的,但总和不是0.例如:

   V = [1,0,1]
   V_norm = [0.74,0,0.74]

   V = [1,1,1]
   V_norm = [0.54,0.54,0.54]
Run Code Online (Sandbox Code Playgroud)

(我不确定这个数字是否正确,因为我现在不能使用Matlab,但我确定总和> 1)

Ahy暗示?

先感谢您

Eit*_*n T 9

......标准化的向量应该是:

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1

那要看.你的规范功能是什么?

norm(x)在MATLAB中返回标准范数,意味着规范化向量的元素的平方x为1.

在你的例子中:

v = [1, 1, 1];         %# norm(v) = sqrt(1^2+1^2+1^2) = ~1.7321
v_norm = v / norm(v);  %# v_norm = [0.5574, 0.5574, 0.5574]
Run Code Online (Sandbox Code Playgroud)

sum(v_norm .^ 2)确实收益率为1,但sum(v_norm)不如预期的那样收益率.


我需要对N个整数的向量进行归一化,使每个值与其原始值成比例(该值将介于0和1之间),并且所有值的总和为1.

" normalize " 是什么意思?这是否意味着根据规范定义除以一个有效数学范数函数的值?

" 比例 " 是什么意思?这是否意味着所有元素都乘以相同的数字?如果确实如此,并且它是一个有效的数学范数,则无法保证元素的总和将始终为1.
例如,请考虑v = [1, -2].然后sum(v) = -1.

或者也许sum是你正在寻找的函数,但它在数学上不符合规范,因为规范是一个为向量空间中的所有向量分配严格正长度或大小的函数.
在上面的例子中,sum(v)是否定的.


Ahy暗示?

您可以选择:

  1. sum(x),它既满足要求,又不符合规范函数,因为它可以产生负值.
  2. norm(x, 1)正如OleThomsenBuus建议的那样,实际计算出来的sum(abs(x(:))).
    除非将向量空间限制为非负向量,否则它不会满足您的要求.


Ole*_*uus 9

我相信,你需要做的是使用1-norm(出租车规范)进行标准化:

v = [2, 2, 1, 0];
v_normed = v / norm(v, 1); % using the 1-norm
Run Code Online (Sandbox Code Playgroud)

变量v_normed现在应该是[0.4, 0.4, 0.2, 0.0].1-norm v_normed将等于1.您还可以对向量求和(类似于1-norm,但不对每个值应用绝对函数),但该总和的范围将在-1到1之间case(如果任何值v低于0).你可以使用abs得到的总和,但从数学上来说,它将不再符合规范.


Dev*_*eve 6

如果您的规范化没有比您在问题开头时给出的更好的条件,那么可能的解决方案就是

V = [3 4 -2];
S = sum(V);
if (S == 0)
    % no solution
else
    V_norm = V ./ S;
end
sum(V_norm)
Run Code Online (Sandbox Code Playgroud)

  • @Serg那是对的.我仍然认为在将标量运算符应用于向量时使用`.`是一种好习惯,因为它使代码无人值守. (2认同)