这应该很容易。
我有一个数字列表。如何在-1.0
和1.0
之间缩放列表的值,以便min = -1
和max = 1.0
?
答案 0 :(得分:16)
找出最小值和最大值
然后是每个数字刻度x
到2 * (x - min)/( max - min) - 1
只是为了检查 -
如果是长列表,则预先计算c = 2/(max - min)
并使用c * x - 1
进行缩放是一个好主意。
答案 1 :(得分:5)
这是签名规范化
1 - 获取列表中的最小值和最大值(MinVal,MaxVal)
2 - 使用此表达式转换每个数字 signedNormal =(((originalNumber - Minimum)/(Maximum - Minimum))* 2.0) - 1.0
为了清楚起见,我刻意将此效率降低 - 效率更高
double min = myList.GetMinimum();
double max = myList.GetMaximum();
double signedRangeInverse = 1.0 / (max - min);
for(int i = 0;i < myList.NumberOfItems();i++)
myList[i] = (((myList[i] - min) * signedRangeInverse) * 2.0) - 1
每次重新计算范围都没有意义 划分范围没有意义,mult更快
答案 2 :(得分:1)
如果你希望0在最终结果中仍然等于0:
E.g
[ -5, -3, -1, 0, 2, 4]
幅度最大的数字是-5。我们可以通过乘以0.2(-1 / -5)得到它等于-1。 (如果你的数字都是0,请注意除以0。)
所以将所有元素乘以0.2。这会给:
[-1, -0.6, -0.2, 0, 0.4, 0.8]
虽然注意到
[ -5, -5, -5 ] -> [ -1, -1, -1 ]
和
[ 5, 5, 5 ] -> [ 1, 1, 1 ]
和
[ 0, 0, 0 ] -> [ 0, 0, 0 ]
这可能是也可能不是你想要的。感谢@Hammerite用他非常有帮助的评论提示我这个:)