C++ 将双精度列表规格化为范围-1到1或0到255

C++ 将双精度列表规格化为范围-1到1或0到255,c++,normalization,C++,Normalization,我有一个范围在-1.396655到1.74707之间的双精度列表,甚至可以更高或更低,无论哪种方式,我都可以在标准化之前知道Min和Max值是什么。我的问题是如何将-1到1之间的这些值标准化,或者更好地将它们从0的双值转换为255 任何帮助都将不胜感激 double range = (double)(max - min); value = 255 * (value - min)/range 您需要一个形式为y=mx+c,并且需要找到一个m和一个c。您有两个固定数据点,即: 1 = m * m

我有一个范围在
-1.396655
1.74707
之间的双精度列表,甚至可以更高或更低,无论哪种方式,我都可以在标准化之前知道
Min
Max
值是什么。我的问题是如何将
-1
1
之间的这些值标准化,或者更好地将它们从
0
的双值转换为
255

任何帮助都将不胜感激

double range = (double)(max - min);
value = 255 * (value - min)/range
您需要一个形式为
y=mx+c
,并且需要找到一个
m
和一个
c
。您有两个固定数据点,即:

 1 = m * max + c
-1 = m * min + c

从这里开始,它就是。

最简单的事情是首先移动所有值,使min为0,从每个数字中减去min。然后乘以255/(Max-Min),这样移位的Max将映射到255,其他所有内容都将线性缩放。我相信你的方程会是这样的:

newval=(无符号字符)((oldval-Min)*(255/(Max-Min)))


在转换为char之前,您可能需要更仔细地进行四舍五入。

有两个更改需要进行

首先,使用256作为限制

第二,确保您的范围稍微缩小,以避免达到256

    public int GetRangedValue(double value, double min, double max)
    {
        int outputLimit = 256;

        double range = (max - min) - double.Epsilon; // Here we shorten the range slightly

        // Then we build a range such that value >= 0 and value < 1
        double rangedValue = (value - min) / range;

        return min + (int)(outputLimit * rangedValue);
    }
public int GetRangedValue(双值、双最小值、双最大值)
{
int outputLimit=256;
double range=(max-min)-double.Epsilon;//这里我们稍微缩短范围
//然后我们构建一个范围,使得值>=0,值<1
双量程值=(值-最小)/量程;
返回min+(int)(输出限制*范围值);
}

随着这两个变化,你将得到正确的输出。

< P>我在用C++做一些卷积的时候解决了这个需要。 希望我的代码能为您提供有用的参考:)

bool规范化(uint8_t*&dst,double*src,int-width,int-height){
dst=新uint8_t[尺寸(uint8_t)*宽度*高度];
如果(dst==NULL)
返回false;
膜组(dst,0,尺寸(uint8_t)*宽度*高度);
double max=std::numeric_limits::min();
双最小值=标准::数值限制::最大值();
双范围=标准::数值限制::最大值();
双范数=0.0;
//找到边界

对于(int j=0;j),您可能会发现有帮助。对不起,我是一个noob,我不时需要帮助:(我的第一次反对票……让我觉得自己是垃圾。有时当你试图解决某件事时,你到处找,什么也找不到,或者如果你找到了,你就是抓不住,所以我想到了这个伟大的社区,我知道友好的人会试图帮助/让我理解。
bool normalize(uint8_t*& dst, double* src, int width, int height) {
    dst = new uint8_t[sizeof(uint8_t)*width*height];
    if (dst == NULL)
        return false;
    memset(dst, 0, sizeof(uint8_t)*width*height);
    double max   = std::numeric_limits<double>::min();
    double min   = std::numeric_limits<double>::max();
    double range = std::numeric_limits<double>::max();
    double norm  = 0.0;
    //find the boundary
    for (int j=0; j<height; j++) {
        for (int i=0; i<width; i++) {
            if (src[i+j*width] > max) 
                max = src[i+j*width];
            else if (src[i+j*width] < min)
                min = src[i+j*width];
        }
    }
    //normalize double matrix to be an uint8_t matrix
    range = max - min;
    for (int j=0; j<height; j++) {
        for (int i=0; i<width; i++) {
            norm = src[i+j*width];
            norm = 255.0*(norm-min)/range;
            dst[i+j*width] = (uint8_t)norm;
        }
    }
    return true;
}