gpt4 book ai didi

c# - 在 C# 中加速矩阵加法

转载 作者:可可西里 更新时间:2023-11-01 08:32:06 25 4
gpt4 key购买 nike

我想优化这段代码:

public void PopulatePixelValueMatrices(GenericImage image,int Width, int Height)
{
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
Byte pixelValue = image.GetPixel(x, y).B;
this.sumOfPixelValues[x, y] += pixelValue;
this.sumOfPixelValuesSquared[x, y] += pixelValue * pixelValue;
}
}
}

这将用于图像处理,我们目前正在为大约 200 张图像运行它。我们优化了 GetPixel 值以使用不安全的代码,并且我们没有使用 image.Width 或 image.Height,因为这些属性增加了我们的运行时成本。

但是,我们仍然停留在低速。问题是我们的图像是 640x480,所以循环中间被调用了大约 640x480x200 次。我想问一下是否有办法以某种方式加快它的速度,或者让我相信它已经足够快了。也许一种方法是通过一些快速的矩阵加法,或者矩阵加法本质上是一个 n^2 运算而无法加速它?

也许通过不安全代码进行数组访问会加快速度,但我不确定如何去做,也不确定是否值得花时间。可能不会。谢谢。

编辑:感谢您的所有回答。

这是我们正在使用的 GetPixel 方法:

 public Color GetPixel(int x, int y)
{
int offsetFromOrigin = (y * this.stride) + (x * 3);
unsafe
{
return Color.FromArgb(this.imagePtr[offsetFromOrigin + 2], this.imagePtr[offsetFromOrigin + 1], this.imagePtr[offsetFromOrigin]);
}
}

最佳答案

尽管使用了不安全的代码,GetPixel 很可能是这里的瓶颈。您是否研究过通过一次 调用而不是每个像素一次获取图像中所有像素的方法?例如,Bitmap.LockBits可能是你的 friend ...

在我的上网本上,一个非常简单的循环迭代 640 * 480 * 200 次只需要大约 100 毫秒 - 所以如果你发现一切进展缓慢,你应该再看看这个位在循环内。

您可能想要了解的另一项优化:避免使用多维数组。它们比一维数组慢得多。

特别是,您可以拥有一个大小为 Width * Height 的一维数组,并且只保留一个索引:

int index = 0;
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
Byte pixelValue = image.GetPixel(x, y).B;
this.sumOfPixelValues[index] += pixelValue;
this.sumOfPixelValuesSquared[index] += pixelValue * pixelValue;
index++;
}
}

使用相同的简单测试工具,将写入添加到二维矩形阵列需要循环超过 200 * 640 * 480 的总时间,最多约 850 毫秒;使用一维矩形阵列将其降低到大约 340 毫秒 - 所以它有点重要,目前每个循环迭代有两个。

关于c# - 在 C# 中加速矩阵加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com