我的项目中有一个名为li的列表,其中包含一些二维的整数数组。我想拥有数组相等索引的最大值,并创建一个名为array2的新数组。我写了这段代码,但速度很慢。
for (int i = 0; i < 100; i++)//the size of each array is [100,100]
for (int j = 0; j < 100; j++)
{
int ma = -2;
int d = 0;
while (d <= f)//"f" is the number of items in the list
{
ma = Math.Max(ma, Convert.ToInt32(li[d].GetValue(i, j)));
d++;
}
array2[i, j] = ma;
}
我怎样才能拥有更好的产品? 是否可以通过使用emguCv进行改进?如果是的话,我该怎么做? 提前谢谢。
答案 0 :(得分:1)
如果li
是整数数组,则可以将代码更改为:
ma = Math.Max(ma, li[d][i, j]);
所以你不会有装箱/取消装箱来访问li
元素(GetValue
是一种访问数组元素的慢速方法)
更清楚地说明:
int[,] temp = li[d];
ma = Math.Max(ma, temp[i, j]);
答案 1 :(得分:1)
我认为您无法更改代码的时间复杂度。目前,代码的复杂性为O(n²·f)
,这是您可以期望的最佳状态,因为您必须至少访问n²·f
个元素才能创建array2
(其中n²
是二维数组的大小。)
您可以更改迭代的顺序,但不会改变复杂性。根据{{1}}:
的实现,它可以更加缓存一点GetValue
在运行此代码之前,您应该将for(int d=0; d<f; d++)
{
var arr = li[d];
for(int i=0; i<100; i++)
{
for(int j=0; j<100; j++)
{
array2[i,j] = Math.Max(array2[i,j], Convert.ToInt32(arr.GetValue(i,j)));
}
}
}
的每个值初始化为array2
,以使其与您当前的代码兼容。
您可能希望尝试并行化代码并使用多个工作线程来计算-2
的不同部分。如果您使用的是4.0框架,则可以使用Parallel class。