【问题标题】:How would i work out magnitude quickly for 3 values?我如何快速计算出 3 个值的大小?
【发布时间】:2017-02-24 17:06:25
【问题描述】:

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

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);
}

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

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

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

我知道我可以多线程并并行化它,但我想在此之前优化我的代码。

【问题讨论】:

  • 对不起,我是新来的。我真的不明白这是一堵文字墙;它有8行,而且行很短。代码也只有 27 行,如果你知道我用来计算 LAB 值的数学,我认为它会有所帮助
  • 这样更好吗?
  • 感谢您的帮助! :)
  • 您是否分析过 root 是否实际上是减慢速度的操作?如果它几乎没有影响,那么优化它是没有意义的。提高性能的另一个选择是使用并行化,这对于这个算法来说很简单。
  • 我已经分析过了,这就是速度变慢的根本原因。我想在优化算法后进行并行化。即使使用 Parallel,该算法对于我的应用程序来说仍然太慢(它是我应用程序的主要部分)

标签: c# math unity3d


【解决方案1】:

如果你只是想比较这些值,为什么不把平方根排除在外,用长度的平方来处理?

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

【讨论】:

  • 我会试一试,但我希望它具有正确的比例,并且我认为可以使用计算差异和平方根作为后备的混合来使其准确。
  • 分析器是否验证平方根是当前瓶颈?
  • 平方根绝对是瓶颈
  • 然后用它的泰勒级数来近似。早在九十年代初,我就遇到了完全相同的问题,在 dos 中编写 3D 游戏:D
  • 在我的帖子中添加了 taylor 系列的链接 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2015-12-27
  • 2013-08-30
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多