c++中的矩阵和向量模板类
Posted
技术标签:
【中文标题】c++中的矩阵和向量模板类【英文标题】:matrix and vector template classes in c++ 【发布时间】:2009-11-15 18:02:41 【问题描述】:#include <array>
template <typename T>
class Vector4<T>
std::array<T, 4> _a; // or 'T _a[4];'?
;
template <typename T>
class Matrix4<T>
std::array<T, 16> _a; // or 'T _a[16];'?
//Vector4<T> row0; // or should i use this instead
//Vector4<T> row1; // it makes other code easier but how
//Vector4<T> row2; // can i implement something like
//Vector4<T> row3; // std::array::data()?
;
谢谢
编辑:是的,它用于 3d 游戏编程...所以我需要更多,然后 boost 矩阵可以提供任何东西,例如旋转、平移和反转等...
【问题讨论】:
把问题写在代码块之外,很难看出你到底在问什么。 嗯,ublas 是一个线性代数库。所以它是为矩阵乘积之类的操作而设计的。旋转、平移无非是矩阵产品。因此,如果您想这样做,那么我强烈建议您去 ublas。 实际上,虽然我没有做过任何测试,但在编译时知道矩阵的大小可以帮助编译器优化。游戏不需要通用的运行时大小的矩阵。 【参考方案1】:你想要的方式是
std::vector<std::vector<int> > my_matrix(4, std::vector<int>(4));
但是,如果您想处理矩阵,我宁愿使用 boost 中的 ublas:
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
int main ()
using namespace boost::numeric::ublas;
matrix<double> m (3, 3);
for (unsigned i = 0; i < m.size1 (); ++ i)
for (unsigned j = 0; j < m.size2 (); ++ j)
m (i, j) = 3 * i + j;
std::cout << m << std::endl;
例子来自他们的网站http://www.boost.org/doc/libs/1_40_0/libs/numeric/ublas/doc/matrix.htm
【讨论】:
当他只对 4x4 矩阵感兴趣时,我不建议使用动态分配的矩阵... 确实,如果编译器在编译时知道它正在处理的矩阵的大小,它就能更好地优化。我会使用std::/boost::array
。【参考方案2】:
我发现Eigen 是最简单的 C++ 线性代数库,它包含用于固定和可变维向量和矩阵的模板。与 Boost 一样,它是一个纯模板“库”,因此没有要构建/包含的库,但我发现它比 Boost 的 ublas 更完整且性能显着提高。
【讨论】:
【参考方案3】:已经有一个标准的std::vector
类。如果您需要专门用于线性代数的东西,我建议您研究 boost ublas。
【讨论】:
vector默认在堆上分配数据,对于固定大小的vector/matrix这样的小数据对象来说不是一个好的选择。【参考方案4】:我认为您不需要 std::array _a[4],因为您将使用它创建 4 个数组。
【讨论】:
【参考方案5】:Boost ublas 是一个很棒的库,但如果你想要的只是 4-D 的东西,它并没有优化。我建议保持这两个类独立:
template <typename T>
class Vector4<T>
T _a[4];
;
template <typename T>
class Matrix4<T>
T _m[4][4];
;
如果需要,您始终可以将指向行的指针 (_m[i]
) 转换为 Vector4。要获得列向量,您需要像 ublas 使用的适配器类。
【讨论】:
为什么不将矩阵从向量数组中取出而不是强制转换? 我也想知道... nvidia sdk 矩阵类使用 T _m[16] 而不是 T _m[4][4]以上是关于c++中的矩阵和向量模板类的主要内容,如果未能解决你的问题,请参考以下文章