C# 如何快速计算出3个值的大小?

C# 如何快速计算出3个值的大小?,c#,math,unity3d,C#,Math,Unity3d,如何对3个值使用快速幅值计算(而不是使用平方根)?(+/-3%就足够了) 这是重要的部分:totalDifference+=Math.Sqrt((L-LT)*(L-LT)+(A-AT)*(A-AT)+(B-BT)*(B-BT)) 我知道在线上有FastMagnitude计算,但所有在线计算都是针对两个值,而不是三个值。例如,我可以使用两个值之间的差异来获得精确的答案吗?(通过在方程中实现差值,如果差值百分比较大,则返回到平方根?) 将这些值相加并每4个像素迭代一次平方根是我能做的最后一个选择。但

如何对3个值使用快速幅值计算(而不是使用平方根)?(+/-3%就足够了)

这是重要的部分:
totalDifference+=Math.Sqrt((L-LT)*(L-LT)+(A-AT)*(A-AT)+(B-BT)*(B-BT))

我知道在线上有
FastMagnitude
计算,但所有在线计算都是针对两个值,而不是三个值。例如,我可以使用两个值之间的差异来获得精确的答案吗?(通过在方程中实现差值,如果差值百分比较大,则返回到平方根?)

将这些值相加并每4个像素迭代一次平方根是我能做的最后一个选择。但首先,我想知道是否有可能对3个值进行良好的
FastMagnitude
计算


我知道我可以多线程并对其进行并行化,但我想在这样做之前优化我的代码。

如果您只想比较这些值,为什么不忽略平方根并使用长度平方


或者使用1+x的平方根并提前截断:)

如果您只想比较这些值,为什么不将平方根去掉,然后使用长度平方



或者使用1+x的平方根,并提前截断:)

对不起,我是新来的。我真的不明白这是一堵文字墙;它有8条线,这些线很短。代码也只有27行,我想如果你知道我用来计算实验室值的数学知识,这会有帮助吗?谢谢你的帮助!:)你有没有分析过根是否真的是减慢速度的操作?如果它几乎没有影响,那么优化它就没有意义了。提高性能的另一个选择是使用并行化,这对于这个算法来说是非常简单的。我想在优化算法后进行并行化。即使是并行的,这个算法对我的应用程序来说还是太慢了(它是我应用程序的主要部分)对不起,我是新来的。我真的不明白这是一堵文字墙;它有8条线,这些线很短。代码也只有27行,我想如果你知道我用来计算实验室值的数学知识,这会有帮助吗?谢谢你的帮助!:)你有没有分析过根是否真的是减慢速度的操作?如果它几乎没有影响,那么优化它就没有意义了。提高性能的另一个选择是使用并行化,这对于这个算法来说是非常简单的。我想在优化算法后进行并行化。即使是并行的,这个算法对我的应用程序来说还是太慢了(它是我应用程序的主要部分)我会尝试一下,但我更希望它有正确的规模,我认为有可能精确,混合使用求差和平方根作为后备。探查器是否验证平方根是当前瓶颈?平方根肯定是瓶颈,然后使用其泰勒级数进行近似。早在90年代初,我就有过同样的问题:在dos中编写一个3D游戏:链接到泰勒级数的DAdded链接到我的帖子:)我会尝试一下,但我更希望它有正确的比例,我认为有可能精确,混合使用求差和平方根作为后备。探查器是否验证平方根是当前瓶颈?平方根肯定是瓶颈,然后使用其泰勒级数进行近似。早在90年代初,我就有过同样的问题:在dos中编写一个3D游戏:链接到泰勒级数的DAdded链接到我的帖子:)
public void RGBToComparison(Color32[] color)
{
    DateTime start = DateTime.Now;
    foreach (Color32 i in color)
    {
        var r = PivotRgb(i.r / 255.0);
        var g = PivotRgb(i.g / 255.0);
        var b = PivotRgb(i.b / 255.0);

        var X = r * 0.4124 + g * 0.3576 + b * 0.1805;
        var Y = r * 0.2126 + g * 0.7152 + b * 0.0722;
        var Z = r * 0.0193 + g * 0.1192 + b * 0.9505;

        var LB = PivotXyz(X / 95.047);
        var AB = PivotXyz(Y / 100);
        var BB = PivotXyz(Z / 108.883);

        var L = Math.Max(0, 116 * AB - 16);
        var A = 500 * (LB - AB);
        var B = 200 * (AB - BB);

        totalDifference += Math.Sqrt((L-LT)*(L-LT) + (A-AT)*(A-AT) + (B-BT)*(B-BT));
    }
    totalDifference = totalDifference / color.Length;
    text.text = "Amount of Pixels: " + color.Length + "  Time(MilliSeconds):" + DateTime.Now.Subtract(start).TotalMilliseconds + "                                  Score (0 to 100)" + (totalDifference).ToString();
    RandomOrNot();
}
private static double PivotRgb(double n)
{
    return (n > 0.04045 ? Math.Pow((n + 0.055) / 1.055, 2.4) : n / 12.92) * 100.0;
}    
private static double PivotXyz(double n)
{
    return n > 0.008856 ? CubicRoot(n) : (903.3 * n + 16) / 116;
}    
private static double CubicRoot(double n)
{
    return Math.Pow(n, 1.0 / 3.0);
}