C# 加快嵌套for循环并提高性能

C# 加快嵌套for循环并提高性能,c#,performance,for-loop,C#,Performance,For Loop,我正在做一个程序,它有一个相当长的执行时间。我正在尽我所能提高绩效,但我在这方面的知识有限。有人能推荐一种加速以下方法的方法吗 public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize) { double sum = 0; for (int i = 0; i < patchSize; i++) { for (int j = 0; j &l

我正在做一个程序,它有一个相当长的执行时间。我正在尽我所能提高绩效,但我在这方面的知识有限。有人能推荐一种加速以下方法的方法吗

public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
{
    double sum = 0;
    for (int i = 0; i < patchSize; i++)
    {
        for (int j = 0; j < patchSize; j++)
        {
            sum += Math.Sqrt(Math.Pow(p1[i, j] - p2[i, j], 2));
        }
    }
    return sum;
}
两点之间的公共静态双距离(双[,]p1,双[,]p2,int patchSize) { 双和=0; 对于(int i=0;i 该方法通过计算两幅图像上两点之间的所有距离之和来计算两幅图像之间的距离

  • 想想你的算法。可能像素距离不是获得精确图像距离的最佳方法

  • sqrt(x^2)
    替换为
    abs(x)
    或更快:

    if(x < 0) x = -x;
    

  • 这应该比你原来的方法快几倍。

    这个方法真的很奇怪,看起来根本不像像素之间的距离。但是你肯定会希望使用线性代数而不是直接的数组计算

    图像识别、自然语言处理和机器学习算法都使用矩阵,因为当您需要批处理时,矩阵库针对此类情况进行了高度优化

    在野外有过多的矩阵库,看这里

    编辑:好的,感谢您的反馈,尝试改进答案

    您可以使用Math.Net Numerics开放源代码库(安装
    MathNet.Numerics
    nuget软件包)并按如下方式重写您的方法:

    using MathNet.Numerics.LinearAlgebra;
    
    public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
    {
       var A = Matrix<double>.Build.DenseOfArray(p1).SubMatrix(0, patchSize, 0, patchSize);
       var B = Matrix<double>.Build.DenseOfArray(p2).SubMatrix(0, patchSize, 0, patchSize);
    
       return (A - B).RowAbsoluteSums().Sum();
    }
    
    使用MathNet.Numerics.linearlgebra;
    两点之间的公共静态双距离(双[,]p1,双[,]p2,int patchSize)
    {
    var A=矩阵.构建.密集阵列(p1).子矩阵(0,patchSize,0,patchSize);
    var B=矩阵.构建.密集阵列(p2).子矩阵(0,patchSize,0,patchSize);
    return(A-B).RowAbsoluteSums().Sum();
    }
    

    本质上,循环会降低代码的速度。理想情况下,在进行批处理时,您应该完全避免循环。

    我不确定您的例程在做什么,但您是否尝试过删除
    Sqrt
    Pow
    操作,并改用
    Abs
    ?我没有,我现在就尝试一下。你知道循环加速的方法吗?我很确定这就是为什么执行时间如此缓慢的原因,这是一个非常奇怪的计算。你想计算什么?你能更详细地解释你的意图吗?我正在搜索和比较图像上的不同补丁。基本上,这是为了图像识别,给出传入的两个补丁(p1和p2),我计算每个像素与原始图像和比较图像的距离。(希望这是有意义的)@ConorShannon-你看起来像是sqrt a^2,实际上只是去掉了
    -
    符号-但我看不出你所做的是如何实现计算距离的目标的(但有时我们并不总是有全局)
    using MathNet.Numerics.LinearAlgebra;
    
    public static double DistanceBetween2Points(double[,] p1, double[,] p2, int patchSize)
    {
       var A = Matrix<double>.Build.DenseOfArray(p1).SubMatrix(0, patchSize, 0, patchSize);
       var B = Matrix<double>.Build.DenseOfArray(p2).SubMatrix(0, patchSize, 0, patchSize);
    
       return (A - B).RowAbsoluteSums().Sum();
    }