Транспонировать 2d динамическую матрицу - PullRequest
2 голосов
/ 18 декабря 2011

Я хочу создать функцию транспонирования для динамических 2d-массивов.Я хочу, чтобы функции имели в качестве параметров 2d-массив, а также строки и столбцы.Я решил использовать двойной указатель.Однако я немного запутался в том, как я собираюсь вызывать функцию из 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;
}

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 18 декабря 2011

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

 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];

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

5 голосов
/ 18 декабря 2011

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

Самая большая проблема заключается в том, что double[10][10] это не конвертируемый в указатель 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))
2 голосов
/ 13 февраля 2015
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;
}

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

...