1

在 C++ 中,我试图将数据从一个矩阵复制到另一个矩阵。我的代码如下:

int data[height][width];
void MyCode::setData ( int newData[height][width] )
{   
    for ( int i = 0; i < height; i ++ )
    {
        for ( int j = 0; j < width; j ++ )
        {
            data[i][j] = newData[i][j];
        }   
    }       
}

我的问题是,这些“for”循环太耗时了,代码就停在这里(可能内存超载,我正在读取视频帧)。我想知道如何使用指针,如下所示:

int* data[height][width];
void MyCode::setData ( int* newData[height][width] )
{   
     data = newData;
}

但它没有用,我不知道原因。有人可以为此建议我更好的解决方案吗?

4

2 回答 2

3

解决此问题的一种方法是使用大小为宽度 * 高度的一维数组。这样您就可以轻松地 memcpy 两者之间的数据。

通过执行以下操作,很容易从行和列中计算出一维数组中的最终位置:

int index = column + (row * width);

编辑:如果您必须使用二维数组,则必须知道其中一个维度。

因此,您可以执行以下操作:

int data[height][width];
void MyCode::setData ( int (*newData)[width] )
{   
    for ( int i = 0; i < height; i ++ )
    {
        for ( int j = 0; j < width; j ++ )
        {
            data[i][j] = newData[i][j];
        }   
    }       
}

在 C++ 中,你最好使用基于模板的解决方案之类的东西,就像你传入一个高度尺寸错误的数组一样,你会遇到问题,编译器不会捕捉到它。

周围有很多模板矩阵库。例如:

http://sourceforge.net/projects/tmv-cpp/

于 2012-09-27T08:41:38.963 回答
1

看看 Boost 的多维数组。它可能实现了更有效的复制操作:

http://www.boost.org/doc/libs/1_51_0/libs/multi_array/doc/user.html

另外,我想看看 Blitz++。该库使用 c++ 中的模板元编程来消除临时变量,并且它们可能已经很好地优化了此类矩阵运算。这是他们的项目所述:

Blitz++ 是一个用于科学计算的 C++ 类库,提供与 Fortran 77/90 相当的性能。它使用模板技术来实现高性能。Blitz++ 提供密集数组和向量、随机数生成器和小向量(用于表示多分量或向量场)。

http://blitz.sourceforge.net/

希望有帮助!

于 2012-09-27T09:48:25.767 回答