我对C#非常陌生,我对我们的数组、数组、交错数组、矩阵等等都有困难。它与C++非常不同,因为我无法获得对矩阵行的引用(除非使用不安全的代码),也不能使用指针之类的方法。
无论如何,问题是:我有一个名为"Image“的结构/类,它包含1024列和768行。对于每一行/列,都有一个包含3个字节的“像素”结构/类。我希望尽可能快地在矩阵的随机位置获取/设置像素。
让我们假设我有一个25像素的矩阵。即5行5列,如下所示:
A B C D E
F G H I J
K L M N O
P Q R S T
U V X W Y
我需要比较M对H和R,然后M对L和N,然后我需要‘和’G+H+I+L+M+N+Q+R+S。
我怎么能这么做?
可能性: 1)创建类似于pixel5的东西(这是一个锯齿状的数组,对吗?),每当我试图比较不同列上的元素时,都会很慢,对吗? 2)创建类似pixel25这样的东西,因为我需要做一些(简单的)数学,来访问元素3)创建类似像素5,5之类的东西.但我不知道如何将它转化为真实的记忆..。如果它是一个单一的内存块,比如pixe25,或者什么的.
由于我打算执行此操作(“随机”和/比较位于不同行/列中的元素),每幅图像要执行数万次。我有1000+图像。代码优化是必须的..。遗憾的是,我不确定我应该使用哪种结构/类别。
TL;DR:以(固定大小)矩阵的随机位置获取/设置元素的最快方法和最简单的(编码明智)方法是什么?
编辑:我不想将C++与C#进行比较。我只是说我是C#新手,我想找到最好的方法来实现这一点,使用C#。请不要告诉我回C++去。
发布于 2014-04-29 08:39:12
我刚做完测试,结果如下:
SD Array Test1: 00:00:00.9388379
SD Array Test2: 00:00:00.4117926
MD Array Test1: 00:00:01.4977765
MD Array Test2: 00:00:00.8950093
Jagged Array Test1: 00:00:03.6850013
Jagged Array Test2: 00:00:00.5036041
结论:单维阵列是一种可行的方法。可悲的是,我们失去了可读性。
下面是代码:
int[] myArray = new int[10000 * 10000];
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
myArray[(i*10000)+j] = i+j;
}
}
Stopwatch sw = new Stopwatch();
int sum = 0;
sw.Start();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += myArray[(j * 10000) + i];
}
}
sw.Stop();
Console.WriteLine("SD Array Test1: " + sw.Elapsed.ToString());
sum=0;
sw.Restart();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += myArray[(i * 10000) + j];
}
}
sw.Stop();
Console.WriteLine("SD Array Test2: " + sw.Elapsed.ToString());
myArray = null;
int[,] MDA = new int[10000, 10000];
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
MDA[i, j] = i + j;
}
}
sum = 0;
sw.Restart();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += MDA[j, i];
}
}
sw.Stop();
Console.WriteLine("MD Array Test1: " + sw.Elapsed.ToString());
sw.Restart();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += MDA[i, j];
}
}
sw.Stop();
Console.WriteLine("MD Array Test2: " + sw.Elapsed.ToString());
MDA = null;
int[][] JA = new int[10000][];
for (int i = 0; i < 10000; i++)
{
JA[i] = new int[10000];
}
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
JA[i][j] = i + j;
}
}
sum = 0;
sw.Restart();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += JA[j][i];
}
}
sw.Stop();
Console.WriteLine("Jagged Array Test1: " + sw.Elapsed.ToString());
sw.Restart();
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
sum += JA[i][j];
}
}
sw.Stop();
Console.WriteLine("Jagged Array Test2: " + sw.Elapsed.ToString());
MDA = null;
Console.ReadKey();
https://stackoverflow.com/questions/23369479
复制相似问题