转置2d动态矩阵

sna*_*ken 2 c++ transpose dynamic matrix

我想为动态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;
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Joh*_*web 5

您的代码存在几个主要问题.

最大的一个是,一个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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

[3,3]((0,1,2),(3,4,5),(6,7,8))
[3,3]((0,3,6),(1,4,7),(2,5,8))
Run Code Online (Sandbox Code Playgroud)


Dav*_*cki 5

你很近.您正确调用该函数,函数的参数列表是正确的.首先,从转置函数中删除此部分:

 mat = new double*[rows];

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

 }
Run Code Online (Sandbox Code Playgroud)

现在确保所有括号都匹配.(有一个缺失.)你不能定义一个静态数组(看起来像这样:):x[y][z]非常量变量作为大小参数.(IE yz必须是常量).但实际上,你传递一个动态数组到转置功能,无论如何,并且rowscolumns不必是常量这样做.所以,在main中,定义一个这样的动态数组:

double** mat = new double*[rows];
for (int i = 0; i < rows; i++)
    mat[i] = new double[columns];
Run Code Online (Sandbox Code Playgroud)

在那之后,你的代码应该工作.但您也可以通过将矩阵显示代码放在函数中来使其更好.然后,不是在任何地方剪切和粘贴它,你所要做的就是调用函数!这是一个很重要的习惯.玩得开心!