3

用什么来存储矩阵值会更好?

float m1,m2,m3 ... ,m16

或者

float[4][4].

我首先尝试了 float[16],但是当我调试和测试 VS 时不会显示数组内部的内容 :( 可以实现 cout 并尝试从控制台测试应用程序中读取答案。

然后我尝试在测试和调试下使用浮点 m1、m2、m3 等,这些值可以在 VS 中读取,因此看起来更容易使用。

我的问题是因为我对 C++ 相当陌生,什么是更好的设计?

我发现float m1,m2 ... ,m16调试时更容易使用。

如果有人可以从经验中说或者有基准数据,我的直觉说它不应该真的很重要,因为矩阵数据应该在内存中布局相同,对吗?

编辑:更多信息它是一个列主矩阵。据我所知,视图转换管道只需要一个 4x4 矩阵。所以没什么大不了的,所以我有一些恒定的值。

忙着写一个简单的软件渲染器,以此来学习更多的 c++ 并获得更多的经验并学习/提高我的线性代数技能。可能只会使用每个片段着色和一些简单的照明模型,到目前为止,我已经看到 4x4 矩阵是我渲染所需的最大矩阵。

Edit2:找出为什么我无法读取数组数据它是我使用的浮点指针,调试菜单只显示指针值我确实发现了一种在手表中查看数组值的方法,你必须在哪里做指针,n 其中 n = 你想看到的元素。

每个回答谢谢的人我现在将使用 Vector4 m[4] 答案。

4

5 回答 5

2

您应该考虑一个Vector4with float [4]members 和一个Matrix4with Vector4 [4]members。使用operator [],您有两个有用的类,并保持访问元素的能力:[i][j]- 在大多数情况下,如果您不使用virtual方法,元素数据将是连续的。

您还可以通过这种方式从向量 (SIMD) 指令中受益,例如,在Vector4

union alignas(16) { __m128 _v; float _s[4]; }; // members

inline float & operator [] (int i) { return _s[i]; }
inline const float & operator [] (int i) const { return _s[i]; }

并且在Matrix4

Vector4 _m[4]; // members

inline Vector4 & operator [] (int i) { return _m[i]; }
inline const Vector4 & operator [] (int i) const { return _m[i]; }
于 2013-04-04T11:24:40.020 回答
1

float m1, m2 .. m16;使用循环遍历事物时,处理起来变得非常尴尬。使用某种数组要容易得多。而且,最有可能的是,当您像“手工编码”一样使用循环时,编译器至少会生成高效代码,除非您实际编写内联汇编程序或使用 SSE 内在函数。

于 2013-04-04T11:35:41.633 回答
0

只要代码不进化,16 浮点数的解决方案就可以了(维护起来很麻烦,而且不是真的可读)

float[4][4] 是一种更好的设计(就大小参数化而言),但您必须了解指针的概念。

于 2013-04-04T11:24:43.057 回答
0

我会使用一个包含 16 个浮点数的数组,float m[16];唯一的原因是使用 Matrix4fv 后缀函数很容易将它传递给像 openGL 这样的库。

类似的 2D 数组也float m[4][4]; 应该在内存中进行相同的配置float m[16](请参阅我可以将 2D 数组视为连续的 1D 数组吗?)并且使用它会更方便[row][col](或者[col][row]我不确定哪个是正确的openGL) 索引(比较m[1][1]vs m[5])。

于 2013-04-04T11:40:50.300 回答
-1

对矩阵元素使用单独的变量可能会被证明是有问题的。在处理像 100x100 这样的大矩阵时,您打算做什么?

当然你需要使用一些类似数组的结构,我强烈建议你至少使用数组

于 2013-04-04T11:28:49.853 回答