【问题标题】:Fast and useful way of storing matrix values in C#在 C# 中存储矩阵值的快速且有用的方法
【发布时间】:2012-10-13 16:21:14
【问题描述】:

我需要在 C# 中为 3D 引擎创建一个 4x4 矩阵类。 我见过一些其他引擎将矩阵值存储在单个浮点成员变量/字段中,如下所示:

float m11, m12, m13, m14
float m21, m22, m23, m24
float m31, m32, m33, m34
float m41, m42, m43, m44

但是,我认为将它们存储在二维数组中对于使用矩阵进行转换/计算会更有用:

float[4][4];

我也想到了一个一维数组 - 但它看起来不太自我解释,并且不会给我比第一个选项更有优势:

float[16];

在 C++ 中,我总是使用“union”关键字来同时存储上述所有可能性。不过C#好像没有这个关键字,所以我得自己决定用哪一个。

在应用转换等时存储 4x4 矩阵的最快方法是什么? 在考虑可用性时,您会选择哪个选项?

【问题讨论】:

  • C# 有multidimensional arrays,所以你可以使用float[4,4]。我的疯狂猜测是它的性能与一维的一样好。两者的性能都可能比 16 个变量差,因为数组是在堆上分配的。
  • @millimoose 性能好还是坏取决于它的使用情况。如果它被传递了很多,在堆上进行一次分配可能比连续传递 16 个变量要好得多。
  • @Servy 你说得对,我应该说“访问两者可能会更慢”。
  • 考虑到这一点,我可能只会对矩阵本身执行操作,例如在矩阵类中实现的方法将用于操作存储的浮点数。我认为它们会被传递而不是被操纵,所以我会以这种方式保留 16 个浮点变量。

标签: c# performance math matrix usability


【解决方案1】:

你可以使用二维数组:

float[,] matrix = new float[4,4];

这与锯齿状数组不同:

float[][] matrix = new float[][4];

二维数组在下面存储为一个大的一维数组。该类只是将它从您那里抽象出来,并提供提供两个(或更多)维度的访问器。因为它在后端存储为一维数组,所以您将保持缓存/内存局部性。

【讨论】:

  • 实际上,.Net 中的二维数组相当慢。
  • 一般来说,我发现锯齿状数组的访问速度更快,因为每个子数组都可以使用其Length 属性进行访问,从而使编译器能够禁用边界检查。但是对于小型阵列,我不确定您是否会看到这么大的差异。
  • @AndrewMarshall 这将取决于数据的大小,子数组是否全部创建在一起,数据的使用等。您可以编写可以更好地执行的代码案例,如果你想这样做的话。
  • 这是迄今为止最好的解决方案,因为我忘记了二维数组的正确/更好的声明......但是由于问题 cmets 中的讨论,我现在更喜欢 16 个浮点变量。
【解决方案2】:

为什么不看看这篇CodeProject.com 文章Efficient Matrix Programming in C#。

您还可以查看 Declaring an Array (Visual C#) 以了解定义您自己的 Matrix 数据结构的各种选项。

【讨论】:

  • CP 文章对我的矩阵类来说有点过载,因为我只会使用 4x4 矩阵并且只对它们进行一些操作,例如他们不需要超级灵活。但它是一个很好的阅读!
【解决方案3】:

最快的方法是使用指针和unsafe 关键字。但是,正如关键字所示,这是不安全的。

有关 C# 中指针的更多信息,请查看 this。

【讨论】:

  • 不一定。使用unsafe 通常会禁用对数组的边界检查,但是如果您使用内置的Length 属性对数组进行迭代,C# 编译器会足够聪明地为您执行此操作。与以往一样,建议 OP 对代码进行基准测试,而不是仅仅假设一种或另一种“可能”更快。
  • 我记得我是如何通过使用 unsafe 来提升图像绘制的,但是对于这个矩阵问题,我想避免使用不安全的代码。
  • @Pac-Man 您要求最快...无论如何,我同意您应该避免使用unsafe 代码。
  • @elyashiv:是的,这确实是最快的方法,我不是很清楚我最后两句话是不是,我还考虑了“可用性”,我的意思是代码可读性。
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2019-03-08
相关资源
最近更新 更多