Я перевожу некоторый алгоритм на C ++ (который я написал на R и уже перевел на C ++ с необработанными указателями). Проблема с оригинальным переводом C ++ состоит в том, что он терпит крах для больших матриц и страдает от утечек памяти (но примерно в 1000 раз быстрее, чем R, что удивительно) ... Поэтому я попробую еще раз с вектором. В основном у меня есть матрица с нулями и единицами, и я хочу заменить единицы на число, указывающее группу.
Группа будет определяться по горизонтали или вертикали, связанных одной записи.
Я делаю это путем построения матрицы указателей и изменения групповых индексов, на которые они указывают во время процесса.
Код ниже является выдержкой.
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
, а не на правильную.
Я надеюсь, что смогу прояснить проблему.
Какие-либо предложения?
Большое спасибо.