我对 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)创建类似像素[5][5]的东西(这是一个锯齿状数组,对吧?),每当我尝试比较不同列上的元素时,它都会很慢,对吧? 2)创建类似 Pixel[25] 的东西,它不会那么容易编码/准备好,因为我需要对我想要访问元素的每个元素进行一些(简单的)数学运算 3)创建类似 pixe[5,5] 的东西(这是一个多维数组,对吧?)...但我不知道如何将其转换为实际内存...如果它将是一个 block 内存,比如 pixe[25],或者什么...
因为我打算对每个图像执行数万次此操作(不同行/列中的元素的“随机”求和/比较)。我有 1000 多张图像。代码优化是必须的...遗憾的是我不确定应该使用哪种结构/类。
TL;DR:在(固定大小)矩阵的随机位置获取/设置元素的最快和最简单(编码方面)的方法是什么?
编辑:我不想将 C++ 与 C# 进行比较。我只是说我是 C# 新手,我想找到使用 C# 实现这一目标的最佳方法。请不要告诉我回到 C++。
最佳答案
我曾用 C# 进行基于像素的图像处理。我发现你列表中的模式#2 是最快的。为了速度,您必须忘记通过某种漂亮的抽象接口(interface)访问像素。像素处理例程必须明确处理图像的宽度和高度。一般来说,这会产生蹩脚的代码,但除非 Microsoft 改进 C# 编译器,否则我们就只能采用这种方法。
如果 for 循环从数组的索引 0 开始,并以 array.Length - 1 结束,编译器将优化数组索引边界测试。这很好,但通常在处理时您必须一次使用多个像素。
关于c# - 更改/访问矩阵元素的最佳/最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369479/