【发布时间】:2018-11-08 13:27:09
【问题描述】:
我正在将一些算法翻译成 C++(我用 R 编写并且已经用原始指针翻译成 C++)。原始 C++ 翻译的问题在于它会因大型矩阵而崩溃并遭受内存泄漏(但比 R 快大约 1000 倍,这太棒了)......所以我再次尝试使用向量。基本上我有一个零和一的矩阵,并想用一个表示组的数字替换这些矩阵。 一个组将由水平或垂直连接的单项定义。 为此,我建立了一个指针矩阵并在此过程中更改它们指向的组索引。
下面的代码是摘录的。
vector<int> groups(vector<int> matrix, int nrow, int ncol) {
vector<connection> connections;
vector<int *> pointersToIndices;
int zeroGroupIndex = 0;
int* O = &zeroGroupIndex;
int currentN = 1;
int size = nrow * ncol;
vector<int **> pointerMatrix;
for (int i = 0; i < size; i++) {
int** OO = &O;
pointerMatrix.push_back(OO);
}
int col, row, index, leftIndex, upperleftIndex, upperIndex;
for (col = 0; col < ncol; col++) {
for (row = 0; row < nrow; row++) {
index = nrow * col + row;
if (matrix[index] != 0) {
upperIndex = nrow * col + row - 1;
leftIndex = nrow * (col - 1) + row;
if (row == 0 || matrix[upperIndex] == 0) {
currentN++;
matrix[index] = currentN;
pointersToIndices.push_back(&(matrix[index]));
// I assume the following does not do what i intend
pointerMatrix[index] = &pointersToIndices.back();
}
else pointerMatrix[index] = pointerMatrix[upperIndex];
if (col != 0 && matrix[leftIndex] != 0) *pointerMatrix[index] = *pointerMatrix[leftIndex];
}
}
}
....
....
现在的问题是这些作业没有按我的意愿工作。尤其是那一行
pointerMatrix[index] = &pointersToIndices.back();
似乎失败了,因为在循环结束时pointerMatrix 的所有元素都指向pointersToIndices 的最后一个条目,而不是正确的条目。
我希望我能澄清这个问题。 有什么建议么? 非常感谢。
【问题讨论】:
-
“有什么建议吗?” 是的。不要使用指针。另外,帮助自己编写一个可以测试的好的矩阵类。然后,用它来做任何你想做的事情。
-
如果你非常关心速度,你真的应该在一个分配中布局所有矩阵数据,这样内存就不会碎片化。使用矩阵库可能会帮助您更快地完成任务。例如,“Eigen”或 boost lib 也有 1 或 2 个矩阵库。并且还要避免使用原始指针——如果你是一个学习者,这不是一个好主意。
-
如果 push_back 调整向量的大小,则指向向量的指针无效。为什么不存储索引而不是指针?
-
添加到稻田的评论:为什么不存储坐标?毕竟,这是一个矩阵。它还将消除
pointersToIndices。 -
@MikaProuk 我并没有真正明白你的意思,但是拥有一个矩阵和坐标大约相当于拥有该矩阵中元素的地址,只是更具可读性、直观性和健壮性。跨度>