Динамическое распределение памяти во время транспонирования

Я пытаюсь вычислить транспонирование матрицы, которая не n на n.
Проблема в том, что я должен выделить новую память для каждого добавляемого элемента, мне не нужно удалять массив **.
Код это что-то вроде этого.
// инициализировать двумерный массив.

array  = new int*[row];
for (int i=0; i<row; i++){
arr[i] = new int[col]();
}

Сейчас я рассматриваю только один случай, предполагающий, что моя матрица 3 * 4. транспонирование матрицы имеет дим 4 * 3.
Я делаю следующий код, но он дает «НЕИСПРАВНОСТЬ СЕГМЕНТАЦИИ». Идея состоит в том, чтобы выделить новую память для элемента, который будет добавлен в результате транспонирования.
Код является:

int r=col;
int c=row;
if (col<c){
arr  = new int*[row];
for (int i=col; i<=c; i++){
arr[i] = new int[col](); // trying to allocate New Memory to elem.
}

Это дает ошибку здесь.
Любая помощь. Также, если есть какой-либо другой способ решить эту проблему, предложите.

1

Решение

Во втором примере кода вы пишете за пределы массива. arr является row элементы длинные, считая от 0 в row - 1, В цикле для вашего индекса i идет от col в c что эквивалентно row и один элемент за пределами массива. Правильный код будет < вместо <=

for (int i=col; i < c; i++){
arr[i] = new int[col](); // trying to allocate New Memory to elem.
}

Кроме того, могу ли я предложить вам взглянуть на Википедия: Транспонировать, потому что во втором случае вы можете использовать первый пример кода только с переключенными строками и столбцами.

3

Другие решения

Напишите обертку с функциями доступа (например, оператор (строка, столбец) для матриц) и используйте одномерный массив строк размера * столбцов внутри.

Это значительно упрощает работу и сохраняет данные для этой матрицы вместе. Это может иметь преимущества кеша для меньших матриц.

Вот пример, как того требует ваш комментарий. Он очень прост по назначению и не использует никаких шаблонов. Он использует вектор как внутреннее хранилище. Вы можете получить доступ к элементам матрицы, используя оператор (..), например,

Matrix A(3,4);
// fill matrix
// you can access each element in a natural syntax as expected from math
int x = A(2,2);
A(2,2) = 3;

Кроме того, вы, вероятно, должны использовать исключения вместо утверждений для проверки переполнения индекса.

// matrix.h
#include <vector>

class Matrix
{
public:
Matrix(size_t rows, size_t cols);

int& operator()(size_t row, size_t col);
const int& operator()(size_t row, size_t col) const;

int& operator[](size_t index);
const int& operator[](size_t index) const;

Matrix get_transposed() const;

size_t compute_index(size_t row, size_t col) const;

void print();

private:
size_t  _rows;
size_t  _cols;

std::vector<int>  _data;

}; // class Matrix// matrix.cpp
#include "matrix.h"#include <iostream>
#include <cassert>

Matrix::Matrix(size_t rows, size_t cols)
: _rows(rows)
, _cols(cols)
, _data(rows*cols, 0)
{
}int& Matrix::operator()(size_t row, size_t col)
{
const size_t index = compute_index(row, col);
assert(index < _data.size());
return _data[index];
}

const int& Matrix::operator()(size_t row, size_t col) const
{
const size_t index = compute_index(row, col);
assert(index < _data.size());
return _data[index];
}int& Matrix::operator[](size_t index)
{
return _data[index];
}

const int& Matrix::operator[](size_t index) const
{
return _data[index];
}

size_t
Matrix::compute_index(size_t row, size_t col) const
{
// here you should check that:
// row < rows
// col < cols
// and throw an exception if it's not
assert(row<_rows);
assert(col<_cols);

return row * _cols + col;
}

Matrix
Matrix::get_transposed() const
{
Matrix t(_cols,_rows);

for(size_t row = 0; row < _rows; ++row)
for(size_t col = 0; col < _cols; ++col)
{
t(col,row) = (*this)(row,col);
}
return t;
}
3

По вопросам рекламы [email protected]