在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;
}
但它没有用,我不知道原因。有人可以建议我更好的解决方案吗?
答案 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 ++中,你最好使用像基于模板的解决方案之类的东西,比如像传入一个具有错误高度维度的数组一样,你会遇到问题并且编译器无法捕获它。
周围有很多模板矩阵库。例如:
答案 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 ++提供密集的数组和向量,随机数生成器和小向量(用于表示多组件或向量字段)。
希望有所帮助!