如何使用Matlab对具有负值的向量进行归一化处理?

3
给定一个向量,比如说 v=[1 2 2],需要对其进行规范化,使得结果矩阵中所有值的和为1。我使用Matlab代码 w=v/norm(v,1) 来实现这一需求。现在结果为 w=[0.2000 0.4000 0.4000],即 sum=0.2+0.4+0.4=1,满足条件。但当输入负值时,结果就会出错。例如,如果 v=[1 -2 2] 并且执行 w=v/norm(v,1) 。那么结果就是 w=[0.2000 -0.4000 0.4000],而sum = 0.2+(-0.4)+0.4 != 1。这个和不等于1。于是我尝试了 w=abs(v)/norm(v,1) 这段代码。请问这样做正确吗?

我相信那是正确的。只是要注意,当你取绝对值时,你正在“丢弃”有关单位向量方向的信息。 - darthbith
1
你对归一化的要求是什么?它不能仅仅是为了加起来等于1,因为[1 -2 2]已经加起来等于1了... - Dan
取决于你的具体目的。也许@Dan的回答可以帮助你,如果不行,请更详细地解释一下你的要求。 - Adiel
2个回答

0
我会考虑减去最小值:
V = v - min(v)
W = V/norm(V,1)

现在sum(W)等于1,如果您使用abs,则不会丢弃信息。

@darthbith 我认为这不是必需的。它将向量归一化,使其元素总和为1。当然,Vv具有不同的“范数”。 - Dan
我猜这取决于 OP 的目的是什么。如果他想要原始向量方向上单位向量的长度(根据定义为1),那么 abs 方法应该是正确的。这就是我假设的。没有任何讽刺意味(即出于好奇 :-)),使用这种方法归一化向量有什么用处? - darthbith
假设v=[1 -2 2],使用代码V = v - min(v),W = V/norm(V,1),结果为W=[0.4286 0 0.5714]。现在总和为1,但一个元素为零。我的项目下一步是W*S,即将W中的每个元素乘以S。现在W的第二个元素为0,因此它会返回所有元素为零...如何纠正它???请帮帮我... - Jaya
2
@user3148302 在你明确定义需求之前,我无法帮助你。S是什么?请解释一下你的总体目标。 - Dan
@darthbith 计算单位向量会使用 norm(v,2) 吗?也许这就是 OP 想要的。norm(v/norm(v,2),2) 等于 1。这可能比使总和等于 1 更有意义。 - Dan
显示剩余6条评论

0

norm(v,1) 忽略符号(它计算的是 sum(abs(v)))。为使向量总和为1,您可以使用如下代码:

w = v/sum(v);

当使用此代码时,如果sum(v)==0,则w=inf。 - Jaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接