Транспонировать 2-мерную динамическую матрицу

Я хочу создать функцию транспонирования для динамических 2-мерных массивов. Я хочу, чтобы функции имели в качестве параметров 2-мерный массив, а также строки и столбцы. Я решил использовать двойной указатель. Однако я немного запутался в том, как я буду вызывать функцию из main. Итак, у меня есть приведенный выше код

#include<iostream>
using namespace std;


void transposeMatrix(double **mat, int rows, int columns)
{


   mat = new double*[rows];

   for (int i = 0; i < rows; ++i)
   {
      mat[i] = new double[columns];
   }


   double temp;

   for (int i = 0; i<rows; i++)
   {

      for (int j = i+1; j<columns; j++)
      {

         temp=mat[i][j];
         mat[i][j]=mat[j][i];
         mat[j][i]=temp;
      }
   }


   cout<< "\n";

   for (int i = 0; i<rows; i++)
   {

      for (int j = 0; j<columns; j++)
      {

         cout << mat[i][j] << " \t";
      }

      cout << "\n";
   }
}


int main()
{
   int rows = 10;
   int columns = 10;
   double mat[rows][columns];

   for (int i = 0; i<rows; i++)
   {

      for (int j = 0; j<columns; j++)
      {

         mat[i][j] = j;
      }
   }

   for (int i = 0; i<rows; i++)
   {

      for (int j = 0; j<columns; j++)
      {

         cout << mat[i][j] << " \t";
      }

      cout << "\n";
   }

   //mat = new double[50][1];
   transposeMatrix(mat, 10, 10);



   system("pause");
   return 0;
}

Любая идея?


person snake plissken    schedule 18.12.2011    source источник
comment
Пожалуйста, попробуйте отформатировать код в ваших вопросах. Astyle - пример хорошего средства форматирования кода. Кроме того, это домашнее задание?   -  person Lalaland    schedule 18.12.2011
comment
В этом коде есть логическая ошибка. mat = new double*[rows]; приведет к тому, что вы потеряете переданный массив. `   -  person Lalaland    schedule 18.12.2011
comment
Это не домашнее задание, на самом деле я хочу создать функцию, которая переносит общие 2-мерные функции для проекта. Функция перестановки работает правильно. Если я помещаю инициализацию матрицы внутри функции, она возвращает желаемые результаты. Но я не знаю, как это назвать.   -  person snake plissken    schedule 18.12.2011
comment
Ммм, этот код заменяет матрицу на место. Это работает, только если матрица квадратная, поэтому строки = столбцы.   -  person nat chouf    schedule 20.02.2013


Ответы (3)


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

 mat = new double*[rows];

 for (int i = 0; i < rows; ++i)
     mat[i] = new double[columns];

 }

Теперь убедитесь, что все скобки совпадают. (Один отсутствовал.) Вы не можете определить статический массив (тот, который выглядит так: x[y][z]) с непостоянными переменными в качестве аргументов размера. (То есть y и z должны быть константами.) Но на самом деле вы все равно передаете динамический массив в функцию транспонирования, и для этого rows и columns не обязательно должны быть константами. Итак, в основном, определите динамический массив следующим образом:

double** mat = new double*[rows];
for (int i = 0; i < rows; i++)
    mat[i] = new double[columns];

После этого ваш код должен заработать. Но вы также можете улучшить его, поместив код отображения матрицы в функцию. Затем, вместо того, чтобы вырезать и вставлять его повсюду, все, что вам нужно сделать, это вызвать функцию! Это важная привычка. Развлекайся!

person David Winiecki    schedule 18.12.2011
comment
@snake plissken: лучший способ поблагодарить - принять ответ. - person Vinayak Garg; 18.12.2011

В вашем коде есть пара серьезных проблем.

Самый большой из них заключается в том, что double[10][10] является неконвертируемым < / a> на указатель double**.

У вас также есть утечка памяти (mat) в вашей transposeMatrix() реализации.

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

А теперь, сказав это ...


Зачем писать один, если - отличная реализация уже существует?

Пример:

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main () 
{
    using namespace boost::numeric::ublas;

    matrix<double> m(3, 3);
    for (unsigned i = 0; i < m.size1(); ++i)
    {
        for (unsigned j = 0; j < m.size2(); ++j)
        {
            m(i, j) = 3 * i + j;
        }
    }

    std::cout << m << std::endl;
    std::cout << trans(m) << std::endl;
}

Вывод:

[3,3]((0,1,2),(3,4,5),(6,7,8))
[3,3]((0,3,6),(1,4,7),(2,5,8))
person Johnsyweb    schedule 18.12.2011
comment
Как я могу использовать транс в массиве? Нет в matrix.hpp. Этот код был просто примером того, что я хочу сделать. Я хочу создать функцию, предназначенную для транспонирования матриц, которые уже существуют. - person snake plissken; 18.12.2011
comment
Если это домашнее задание (заявлено, что это не так), то это вряд ли поможет. Однако этот ответ поможет разработчику на C ++, желающему выполнить транспонирование матрицы. - person Johnsyweb; 18.12.2011

double ** transpose(double **matrix, int rows, int columns){
    double ** trans;                
    trans=new double *[columns];        
    for(int i=0;i<columns;i++){
        trans[i]=new double[rows];
        for(int j=0;j<rows;j++)
            trans[i][j]=matrix[j][i];
    }
    return trans;
    for(int i=0;i<columns;i++)
        delete[] trans[i];  
    delete[] trans;
}

Вот код для транспонирования матрицы.

person Amna    schedule 12.02.2015