Speed up Matrix Addition in C#

前端 未结 15 1084
北荒
北荒 2021-02-05 22:48

I\'d like to optimize this piece of code :

public void PopulatePixelValueMatrices(GenericImage image,int Width, int Height)
{            
        for (int x = 0;         


        
相关标签:
15条回答
  • 2021-02-05 23:12

    Read this article which also has some code and mentions about the slowness of GetPixel.

    link text

    From the article this is code to simply invert bits. This shows you the usage of LockBits as well.

    It is important to note that unsafe code will not allow you to run your code remotely.

    public static bool Invert(Bitmap b)
    {
    
    BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
                                   ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
    
    int stride = bmData.Stride; 
    System.IntPtr Scan0 = bmData.Scan0; 
    unsafe 
    { 
        byte * p = (byte *)(void *)Scan0;
        int nOffset = stride - b.Width*3; 
        int nWidth = b.Width * 3;
        for(int y=0;y < b.Height;++y)
        {
            for(int x=0; x < nWidth; ++x )
            {
                p[0] = (byte)(255-p[0]);
                ++p;
            }
            p += nOffset;
        }
    }
    
    b.UnlockBits(bmData);
    
    return true;
    

    }

    0 讨论(0)
  • 2021-02-05 23:12

    Sometimes doing things in native C#, even unsafe calls, is just slower than using methods that have already been optimized.

    No results guaranteed, but you may want to investigate the System.Windows.Media.Imaging name space and look at your whole problem in a different way.

    0 讨论(0)
  • 2021-02-05 23:13

    I recommend that you profile this code and find out what's taking the most time.

    You may find that it's the subscripting operation, in which case you might want to change your data structures from:

    long sumOfPixelValues[n,m];
    long sumOfPixelValuesSquared[n,m];
    

    to

    struct Sums
    {
        long sumOfPixelValues;
        long sumOfPixelValuesSquared;
    }
    
    Sums sums[n,m];
    

    This would depend on what you find once you profile the code.

    0 讨论(0)
  • 2021-02-05 23:13

    Code profiling is the best place to start.

    Matrix addition is a highly parallel operation and can be speed up by parallelizing the operation w/ multiple threads.

    I would recommend using Intels IPP library that contains threaded highly optimized API for this sort of operation. Perhaps surprisingly it's only about $100 - but would add significant complexity to your project.

    If you don't want to trouble yourself with mixed language programming and IPP, you could try out centerspace's C# math libraries. The NMath API contains easy to used, forward scaling, matrix operations.

    Paul

    0 讨论(0)
  • 2021-02-05 23:15

    About the only way to effectively speed up your matrix multiplication is to use the right algorithm. There are more efficient ways to speed up matrix multiplication.Take a look at the Stressen and Coopersmith Winograd algorithms. It is also noted [with the previous replies] that you can parallize the code, which helps quite a bit.

    0 讨论(0)
  • 2021-02-05 23:15

    If you only do matrix addition, you'd like to consider using multiple threads to speed up by taking advantage of multi-core processors. Also use one dimensional index instead of two.

    If you want to do more complicated operations, you need to use a highly optimized math library, like NMath.Net, which uses native code rather than .net.

    0 讨论(0)
提交回复
热议问题