首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改/访问矩阵元素的最佳/最快方法

更改/访问矩阵元素的最佳/最快方法
EN

Stack Overflow用户
提问于 2014-04-29 15:51:18
回答 1查看 1.4K关注 0票数 2

我对C#非常陌生,我对我们的数组、数组、交错数组、矩阵等等都有困难。它与C++非常不同,因为我无法获得对矩阵行的引用(除非使用不安全的代码),也不能使用指针之类的方法。

无论如何,问题是:我有一个名为"Image“的结构/类,它包含1024列和768行。对于每一行/列,都有一个包含3个字节的“像素”结构/类。我希望尽可能快地在矩阵的随机位置获取/设置像素。

让我们假设我有一个25像素的矩阵。即5行5列,如下所示:

代码语言:javascript
运行
复制
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++去。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-29 16:39:12

我刚做完测试,结果如下:

代码语言:javascript
运行
复制
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

结论:单维阵列是一种可行的方法。可悲的是,我们失去了可读性。

下面是代码:

代码语言:javascript
运行
复制
    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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23369479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档