我的循环在C#中太慢了。我想知道是否有更快的方法来处理这些数组。我目前正在使用.NET 2.0。我不反对升级这个项目。这是涉及灰度级的理论图像处理概念的一部分。
此函数创建这些值的索引。因此pgidx。
int[] pgidx = new int[PixCnt];
sw = new Stopwatch();
sw.Start();
for (i = 0; i < PixCnt; i++)
{
j = 0;
pgidx[i] = 0;
while (list_1d[i] != pg[j] && j < g_len) j++;
if (list_id[i] == pg[j])
pgidx[i] = j
}
sw.stop();
Debug.WriteLine("PixCnt Loop took" + sw.ElapsedMilliseconds + " ms");
答案 0 :(得分:1)
我认为使用字典存储pg
数组中的内容会加快速度。 g_len
是4625个元素,因此您可能会平均内部while循环的2312次迭代。用字典中的单个哈希查找替换它应该更快。由于外循环执行了2100万次,因此加速该循环的主体应该获得巨大的回报。我猜测下面的代码会让你的时间加快100到1000倍。
var pgDict = new Dictionary<int,int>(g_len);
for (int i = 0; i < g_len; i++) pgDict.Add(pg[i], i);
int[] pgidx = new int[PixCnt];
int value = 0;
for (int i = 0; i < PixCnt; i++) {
if (pgDict.TryGetValue(list_id[i], out value)) pgidx[i] = value;
}
请注意,在找不到匹配项时将pgidx[i]
设置为零是不必要的,因为在创建数组时,数组的所有元素都已初始化为零。
如果pg
中的值有可能出现多次,您可能需要首先检查是否已添加该密钥,如果有,则跳过将其添加到字典中。这将模仿你目前寻找第一场比赛的行为。为此,用这个替换构建字典的行:
for (int i = 0; i < g_len; i++) if (!pgDict.ContainsKey(pg[i])) pgDict.Add(pg[i], i);
答案 1 :(得分:0)
如果pq
中的像素值范围允许(例如16 bpp = 65536个条目),则可以创建一个辅助数组,将所有可能的灰度级映射到pg
中的索引值。填充此数组是通过pg
上的一次传递完成的(在初始化为全零后)。
然后使用直接表格查找将list_1d
转换为pgidx
。
如果表太大(比图像大),那就像@hatchet一样回答。