Получение неожиданных результатов с матрицей MxN - PullRequest
0 голосов
/ 22 октября 2018

У меня есть базовый класс матрицы шаблонов:

template<class T, unsigned N>
class Matrix {
private:
    static const unsigned Stride = N;
    static const unsigned Size = Stride * Stride;
    T data[Size] = {};

public:
    Matrix() {};
    Matrix( const T* dataIn ) {
        fillMatrix( dataIn );
    }

    void fillMatrix( const T* dataIn );
    void printMatrix();
};

template<class T, unsigned N>
void Matrix<T, N>::fillMatrix( const T* dataIn ) {
    for( unsigned int i = 0; i < Size; i++ ) {
        this->data[i] = dataIn[i];
    }
}

template<class T, unsigned N>
void Matrix<T, N>::printMatrix() {
    for( unsigned int i = 0; i < Stride; i++ ) {
        for( unsigned int j = 0; j < Stride; j++ ) {
            std::cout << this->data[i*Stride + j] << " ";
        }
        std::cout << '\n';
    }
}

Который работает отлично!Данные заполнены правильно и отображаются правильно.Однако, когда я пытаюсь расширить вышеуказанную квадратную 2D-матрицу до MxN-матрицы следующим образом:

template<class T, unsigned M, unsigned N>
class Matrix {
private:
    static const unsigned Row = M;
    static const unsigned Col = N;
    static const unsigned Size = M * N;
    T data[Size] = {};

public:
    Matrix() {};
    Matrix( const T* dataIn ) {
        fillMatrix( dataIn );
    }

    void fillMatrix( const T* dataIn );
    void printMatrix();
};

template<class T, unsigned M, unsigned N>
void Matrix<T,M,N>::fillMatrix( const T* dataIn ) {
    for( unsigned int i = 0; i < Size; i++ ) {
        this->data[i] = dataIn[i];
    }
}

template<class T, unsigned M, unsigned N>
void Matrix<T,M,N>::printMatrix() {
    for( unsigned int i = 0; i < Row; i++ ) {
        for( unsigned int j = 0; j < Col; j++ ) {
            std::cout << this->data[i*Row + j] << " ";
        }
        std::cout << '\n';
    }
}

Я не получаю правильные значения: например, если я передам в этот шаблон класса массив как таковойdouble data[6] = { 1,2,3,4,5,6 }; С экземпляром матрицы Matrix<double, 2,3>, равной 2x3, я получаю значения и распечатку в виде:

1 2 3
3 4 5

Я ожидаю, что данные и выходные данные будут.

1 2 3
4 5 6

По какой-то причине он применяет 3 раза дважды и вообще не добавляет 6 к матрице.

Я неправильно заполнил эту матрицу MxN в функции fillMatrix() или неправильно ее отображаюиндексация в функции printMatrix().Я знаю, что это довольно тривиально, но я пропускаю это и не могу найти то, что мне не хватает.


РЕДАКТИРОВАТЬ

Я работал сотладчик и глядя на члена класса data[Size], и он был заполнен правильными значениями, так что это привело меня к мысли или подозрению, что проблема в функции printMatrix().Когда я делал это, несколько пользователей разместили полезные ответы!Поначалу моя логика казалась правильной, но порядок был неправильным.

Пользователь: Ответ RandomBits фактически решает проблему.Пользователь: Ответ Матье Брухера объясняет проблему.

Я хотел бы принять оба ответа, но могу принять только один.Спасибо вам обоим за информативную информацию.Я пока оставлю этот вопрос открытым.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вектор double, который вы передаете, имеет элементы в порядке C, если вы интерпретируете его как массив 2-d, в то время как ваша функция print печатает элементы в порядке Fortran.Измените i*Row + j на i*Col+j.

0 голосов
/ 22 октября 2018

У вас неправильный дисплей.i - ваш индекс строки, вам нужно умножить его на Col, а не Row.

. Подумайте об индексах, j перемещается от 0 до Col-1, поэтому при переходе кдругой ряд, вам нужно увеличить индекс в соответствии с этим.

...