матричные и векторные шаблоны классов в с ++ - PullRequest
0 голосов
/ 15 ноября 2009
#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()?
};

спасибо

edit: да, это для программирования 3D-игр ... так что мне понадобится больше, чем просто матрица усиления, которая может обеспечить вращение, перевод и инвертирование и т.д.

Ответы [ 5 ]

4 голосов
/ 15 ноября 2009

То, как вы хотите это сделать, будет

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

Тем не менее, я бы предпочел использовать ублас из boost, если вы хотите обрабатывать матрицы:

#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

3 голосов
/ 16 ноября 2009

Я обнаружил, что Eigen является самой простой из библиотек линейной алгебры C ++, и она содержит шаблоны для векторов и матриц фиксированной и переменной размерности. Как и Boost, это чистый шаблон «библиотеки», поэтому нет никаких библиотек для сборки / включения, но я считаю, что он более полный и значительно более производительный, чем Ublas Boost.

0 голосов
/ 16 ноября 2009

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.

0 голосов
/ 15 ноября 2009

Уже есть стандартный std::vector класс. Если вам нужно что-то конкретно для линейной алгебры, я бы посоветовал заглянуть в буст-убл.

0 голосов
/ 15 ноября 2009

Не думаю, что вам нужен std :: array _a [4], так как вы создадите 4 массива с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...