c ++中的矩阵和向量模板类

时间:2009-11-15 18:02:41

标签: c++ arrays vector matrix

#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游戏编程...所以我需要更多然后提升矩阵可以提供像旋转和平移和反转等...

5 个答案:

答案 0 :(得分:4)

你想要的方式是

std::vector<std::vector<int> > my_matrix(4, std::vector<int>(4));

但是,如果你想处理matricies,我宁愿使用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

答案 1 :(得分:3)

我发现Eigen是C ++线性代数库中最直接的,它包含固定和可变维度向量和矩阵的模板。像Boost一样,它是一个纯粹的模板“库”,因此没有构建/包含的库,但我发现它比Boost的ublas更完整,性能更高。

答案 2 :(得分:0)

我认为你不会想要std :: array _a [4],因为你将创建4个数组。

答案 3 :(得分:0)

已经有一个标准的std::vector课程。如果你需要一些专门用于线性代数的东西,我建议你研究一下boost ublas。

答案 4 :(得分:0)

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&lt;&gt;中。如果需要的话。要获得列向量,您需要一个像ublas一样的适配器类。