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++中的矩阵和向量模板类的主要内容,如果未能解决你的问题,请参考以下文章

Eigen向量和矩阵的用法1(C++)

模板类中的 c++ 赋值运算符实现

在C++的模板类中创建向量

模板化成员函数不能从同一个类调用非模板化成员函数,C++

c++ 使用友好类的类型作为模板参数声明 stl 向量

带有标准向量的模板矩阵