在c ++中向向量中添加2x2的矩阵

时间:2015-06-14 21:04:50

标签: c++ matrix vector

我正在尝试使用c ++中的值矩阵填充向量。我对这个程序不是很自信(我不太了解指针,我不知道我是否需要它)但是我正在尝试这个

int auxMat[gray.rows][gray.cols];
vector<int> collectionSum;
collectionSum.push_back(auxMat);

当我尝试编译时,我收到一个错误,上面写着

无效参数'候选者是:void push_back(const int&amp;)

任何人都可以告诉我它是否可以做到,我该如何解决?

我读过一些关于擦除缓存,更改我的eclipse编译器,我的c ++版本的内容,但是我不认为这个问题太大了。

2 个答案:

答案 0 :(得分:0)

您无法将矩阵推回到矢量中。您可以做的是为您的向量预分配内存(为了加快速度),然后使用std::vector<>::assign成员函数来复制&#34;复制&#34;从矩阵到矢量:

vector<int> collectionSum(gray.rows * gray.cols); // reserve memory, faster
collectionSum.assign(*auxMat, *auxMat + gray.rows * gray.cols);

这应该很快。否则,您可以在循环中推回每个单独的元素。

编辑

有关可能的未定义行为的一些技术问题,请参阅May I treat a 2D array as a contiguous 1D array?(感谢@juanchopanza的评论)。我相信代码是安全的,因为矩阵的存储是连续的。

答案 1 :(得分:0)

因为数组auxMat在内存中是连续的,所以你可以直接从内存中将它复制到向量中。在这里,您告诉向量构造函数使用指针算法从auxMat的开头复制到内存结束:

std::vector<int> collectionSum(auxMat, auxMat + (gray.rows * gray.cols));

编辑:

抱歉,我把你的问题看作是一维数组(int *)而不是2D(int **)数组。老实说,我建议切换到一维数组,因为它通常更快更容易使用。根据您使用的行优先顺序还是按列优先顺序,您可以通过以下方式访问所需的元素:

elem = y * width + x;    // for row-first order
elem = x * height + y;   // for column-first order

例如:

// Create a 3x3 matrix but represent it continuously as a 1D array
const int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
const unsigned width = 3;
const unsigned height = 3;
for (int y = 0; y < height; ++y)
{
    for (int x = 0; x < width; ++x)
    {
       printf("%d ", A[y * width + x]);
    }
    printf("\n");
}