C++ 使用MxN矩阵获得意外结果

C++ 使用MxN矩阵获得意外结果,c++,arrays,templates,matrix,indexing,C++,Arrays,Templates,Matrix,Indexing,我有一个基本的模板矩阵类: 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 ) {

我有一个基本的模板矩阵类:

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';
    }
}
我希望数据和输出是正确的

1 2 3
4 5 6
出于某种原因,它两次使用3,而不向矩阵中添加6

我是否在
fillMatrix()
函数中填充此MxN矩阵时出错,或者通过在
printMatrix()函数中编制索引来显示它时出错。我知道这是相当琐碎的,但我忽略了这一点,似乎无法找到我缺少的东西


编辑

我正在使用调试器,查看类的成员
data[Size]
,并且它填充了正确的值,因此这让我想到或怀疑问题出在
printMatrix()
函数中。就在我这么做的时候,一些用户发布了有用的答案!起初我的逻辑似乎是正确的,但顺序是错误的

用户:RandomBits的答案实际上解决了这个问题。 用户:Matthieu Brucher的回答解释了这个问题


我想接受两个答案,但只能接受一个。谢谢你们提供的信息。我暂时不回答这个问题。

您的显示错误
i
是您的行索引,您需要将其与
Col
相乘,而不是
row


考虑索引,
j
从0移动到
Col-1
,因此当移动到另一行时,需要根据此增加索引

您的显示器不正确
i
是您的行索引,您需要将其与
Col
相乘,而不是
row


考虑索引,
j
从0移动到
Col-1
,因此当移动到另一行时,需要根据此增加索引

print
函数按
Fortran
顺序打印元素时,如果将其解释为
2d
数组,则传入的
double
向量的元素顺序为
C
。将
i*Row+j
更改为
i*Col+j

如果在
print
函数以
Fortran
顺序打印元素时将其解释为
2-d
数组,则传入的
double
向量具有
C
顺序的元素。将
i*Row+j
更改为
i*Col+j

我开始倾向于这样做:当我检查调试器时,矩阵中的实际值是正确的,因为成员
数据[Size]
确实有正确的值。这意味着它在打印功能中,并使我倾向于索引。非常感谢。我开始倾向于这一点:当我检查调试器时,矩阵中的实际值是正确的,因为成员
data[Size]
确实有正确的值。这意味着它在打印功能中,并使我倾向于索引。非常感谢。仅供参考,如果操作正确,您应该能够使用1D实现非常接近2D矩阵,只需使用Matrix2D=matrix执行
模板或类似的东西。@WhozCraig我相信这是可以做到的;但我用后一个矩阵或第二个矩阵来回答另一个问题,所以我只想简单一点。为了回答他们的问题,2D方形矩阵不够,所以我将其扩展为任意MxN矩阵,我不想让使用第一个矩阵创建第二个矩阵更加混乱。仅供参考,如果操作正确,您应该能够使用1D实现非常接近2D矩阵,只需使用Matrix2D=matrix执行
模板或类似的东西。@WhozCraig我相信这是可以做到的;但我用后一个矩阵或第二个矩阵来回答另一个问题,所以我只想简单一点。为了回答他们的问题,2D方形矩阵不够,所以我将其扩展为任意MxN矩阵,我不想让使用第一个矩阵创建后一个矩阵更加混乱。打印函数也是C阶,只是索引计算错误。打印函数也是C阶,只是指数的计算是错误的。
1 2 3
3 4 5
1 2 3
4 5 6