我需要规范化N个整数的向量,以便:
例如:
如果我有一个载体
V = [2,2,1,0]
规范化的矢量应该是:
V_norm = [0.4,0.4,0.2,0] % 0.4+0.4+0.2 = 1
我尝试了在这个社区和网络上找到的许多解决方案,最后我用这段代码完成了它:
part = norm(V);
if part > 0
V_norm = V/part;
else % part = 0 --> avoid "divide by 0"
V_norm = part;
end
如果出现以下问题:
但如果我有不同的情况,虽然结果是成比例的,但总和不是0。 例如:
V = [1,0,1]
V_norm = [0.74,0,0.74]
V = [1,1,1]
V_norm = [0.54,0.54,0.54]
(我不确定这个号码是否正确,因为我现在不能使用Matlab,但我确定总和是> 1)
Ahy暗示?
提前谢谢
答案 0 :(得分:9)
......规范化的矢量应该是:
v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1
这取决于。您的norm功能是什么?
norm(x)
返回标准范数,意味着规范化向量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]
sum(v_norm .^ 2)
确实产生1,但sum(v_norm)
没有按预期产生。
我需要对N个整数的向量进行归一化,使每个值与其原始值成比例(该值将介于0和1之间),并且所有值的总和为1.
“ normalize ”是什么意思?根据{{3}},这是否意味着除以一个有效数学范数函数的值?
“比例”是什么意思?这是否意味着所有元素都乘以相同的数字?如果确实如此,并且它是一个有效的数学范数,则无法保证元素的总和将始终为1
例如,考虑v = [1, -2]
。然后是sum(v) = -1
。
或者sum
可能是您正在寻找的功能,但它在数学上不符合规范,因为规范是一个为所有向量分配严格正长度或大小的函数在向量空间。
在上面的示例中,sum(v)
是否定的。
Ahy提示?
您可以选择:
sum(x)
,它既满足要求,又不符合规范函数,因为它可以产生负值。norm(x, 1)
实际计算sum(abs(x(:)))
除非将矢量空间限制为非负矢量,否则它不会满足您的要求。答案 1 :(得分:9)
我认为,您需要做的是使用1-norm(出租车规范)进行规范化:
v = [2, 2, 1, 0];
v_normed = v / norm(v, 1); % using the 1-norm
变量v_normed
现在应为[0.4, 0.4, 0.2, 0.0]
。 v_normed
的1范数将等于1.您还可以对向量求和(类似于1范数,但不对每个值应用绝对函数),但该和的范围将介于-1之间在一般情况下为1(如果v
中的任何值低于0)。您可以对结果总和使用abs
,但从数学上来说,它将不再符合规范。
答案 2 :(得分:6)
如果您的规范化没有比您在问题开头时提供的更多条件,那么可能的解决方案将是
V = [3 4 -2];
S = sum(V);
if (S == 0)
% no solution
else
V_norm = V ./ S;
end
sum(V_norm)
答案 3 :(得分:0)
我将在这里留下我的解决方案,用于“规范化”具有正项的矩阵的行,其中规范化意味着程序后行总和为 1。
normmat = normr(sqrt(mat)).^2
mat
是具有正项的矩阵
mat = [1 2 3; 2 3 4]
mat =
1 2 3
2 3 4
现在我们做单行:
normmat = normr(sqrt(mat)).^2
normmat =
0.1667 0.3333 0.5000
0.2222 0.3333 0.4444
每行的总和为 1。
sum(normmat, 2)
ans =
1.0000
1.0000
一行内的比例是恒定的
normmat ./ mat
ans =
0.1667 0.1667 0.1667
0.1111 0.1111 0.1111
不一定是最有效的,但它是一行。