将数据从一个矩阵复制到另一个矩阵

时间:2012-09-27 08:39:10

标签: c++ pointers matrix copy

在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;
}
但它没有用,我不知道原因。有人可以建议我更好的解决方案吗?

2 个答案:

答案 0 :(得分:3)

这样做的一种方法是使用宽度*高度的一维数组。这样你就可以轻松地记忆两者之间的数据。

通过执行以下操作,可以轻松地从行和列中确定1D阵列中的最终位置:

int index = column + (row * width);

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

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

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/

答案 1 :(得分:1)

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

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

另外,我会看一下Blitz ++。这个lib使用c ++中的模板元编程来消除临时值,他们可能已经很好地优化了这种矩阵运算。这就是他们的项目所说的:

  

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

http://blitz.sourceforge.net/

希望有所帮助!