Я пишу программу для транспонирования данной матрицы с использованием выделенной памяти. Функция отлично работает с квадратной матрицей NxN (rows == cols), но происходит сбой с матрицей MxN (row! = Cols). Пожалуйста помоги
void transpose(int **matrix, int *row, int *col)
{
// dynamically allocate an array
int **result;
result = new int *[*col]; //creates a new array of pointers to int objects
// check for error
if (result == NULL)
{
cout << "Error allocating array";
exit(1);
}
for (int count = 0; count < *col; count++)
{
*(result + count) = new int[*row];
}
// transposing
for (int i = 0; i<*row; i++)
{
for (int j = i+1; j<*col; j++)
{
int temp = *(*(matrix + i) + j);
*(*(matrix + i) + j) = *(*(matrix + j) + i);
*(*(matrix + j) + i) = temp;
}
}
for (int i = 0; i<*row; i++)
{
for (int j = 0; j<*col; j++)
{
*(*(result + i) + j) = *(*(matrix + i) + j);
cout << *(*(result + i) + j) << "\t";
}
cout << endl;
}
}
Линии:
for (int i = 0; i<*row; i++)
{
for (int j = i+1; j<*col; j++)
{
int temp = *(*(matrix + i) + j);
*(*(matrix + i) + j) = *(*(matrix + j) + i);
*(*(matrix + j) + i) = temp;
}
}
являются проблемой. Проблема в том, что матрица индексируется i, затем j, а не j, тогда мне нравится, что вы делаете во второй и третьей строке цикла while. Представьте, что матрица представляет собой матрицу 2х3, затем вы пытаетесь выполнить матрицу [2] [3] = матрица [3] [2], но матрица [3] [2] не существует.
Лучше всего просто инициализировать результат непосредственно в этом цикле:
for (int i = 0; i<*row; i++)
for (int j = 0; j<*col; j++)
result[j][i] = matrix[i][j];
Затем вы можете вывести, как показано ниже, или удалить матрицу и переназначить матрицу, чтобы получить результат, как вы хотите. Вся моя функция транспонирования стала следующим кодом (строки и столбцы не обязательно должны быть указателями на int, передача по значению — это нормально. Также для доступа к матрицам следует использовать индексы массива, поскольку это более приятный стиль):
void transpose(int **matrix, int row, int col)
{
// dynamically allocate an array
int **result;
result = new int *[col]; //creates a new array of pointers to int objects
for (int i = 0; i < col; i++)
result[i] = new int[row];
// transposing
for (int i = 0; i<row; i++)
for (int j = 0; j<col; j++)
result[j][i] = matrix[i][j];
//output resulting matrix
for (int i = 0; i<col; i++) {
for (int j = 0; j<row; j++)
cout << result[i][j] << "\t";
cout << endl;
}
}
Вы пытаетесь транспонировать матрицу «на месте»:
((матрица + i) + j) = ((матрица + j) + i);
ты не должен этого делать. Если количество столбцов больше, чем количество строк, выделенных для matrix
, вы будете читать и писать нераспределенную память.
ИМХО, было бы лучше хранить всю матрицу в непрерывной памяти. Не в разных частях. Таким образом, код будет выглядеть так:
void transpose( int *matrix, int row, int col )
{
for ( int i = 0; i < row; i++ )
{
for ( int j = i + 1; j < col; j++ )
{
int temp = matrix[ i * col + j ];
matrix[ i * col + j ] = matrix[ j * col + i ];
matrix[ j * col + i ] = temp;
}
}
}
Единственный минус этого распределения, что вы не можете обратиться к элементу, как matrix[ i ][ j ]
но только matrix[ i + col + j ]
, Плюсы: 1) легко выделить / освободить память (просто matrix = new int[ col * row ]
а также delete [] matrix
) 2) немного более быстрый доступ к элементам (из-за их постоянного расположения)
В конце, я думаю, что это был бы лучший способ посмотреть на std::vector
, Если вы хотите, я могу показать вам, как вы будете работать с вектором