【问题标题】:Transpose a 2d dynamic matrix转置二维动态矩阵
【发布时间】:2012-01-22 20:56:22
【问题描述】:

我想为动态二维数组创建一个转置函数。我希望函数将二维数组以及行和列作为参数。我决定使用双指针。但是我对如何从 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;
}

有什么想法吗?

【问题讨论】:

  • 请尝试格式化您问题中的代码。 Astyle 是一个很好的代码格式化程序的例子。还有,这是作业吗?
  • 这段代码有逻辑错误。 mat = new double*[rows]; 将导致您丢失传入的数组。 `
  • 这不是功课,实际上我想创建一个函数来为项目转置通用二维函数。转置功能正常工作。如果我将矩阵初始化放在函数内,它会返回所需的结果。但我不知道怎么称呼它。
  • 嗯,这段代码原地转置矩阵。仅当矩阵为正方形时才有效,因此行 = 列。

标签: c++ dynamic matrix transpose


【解决方案1】:

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

最大的一个是double[10][10]not convertible 指向double** 的指针。

您的 transposeMatrix() 实现中也存在内存泄漏 (mat)。

我建议您将打印矩阵和转置矩阵的关注点分开。也许是(模板化)矩阵类上的单独方法。

现在,话虽如此......


a perfectly good implementation already exists时为什么要写一个?

示例:

#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))

【讨论】:

  • 如何在数组中使用 trans?不在matrix.hpp 中。这段代码只是我想做的一个例子。我想创建一个函数来转置已经存在的矩阵。
  • 如果这是家庭作业(据说不是),那么这不太可能有帮助。但是,这个答案将有助于希望进行矩阵转置的 C++ 开发人员。
【解决方案2】:

你很亲密。您正确地调用了函数并且函数的参数列表是正确的。首先,从转置函数中删除这部分:

 mat = new double*[rows];

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

 }

现在确保所有括号都匹配。 (少了一个。) 您不能使用非常量变量作为大小参数来定义静态数组(如下所示:x[y][z])。 (即yz 必须是常量。)但实际上,无论如何,您都在将动态数组传递给转置函数,而rowscolumns 不必是常量即可。因此,在 main 中,定义一个动态数组,如下所示:

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

之后,您的代码应该可以工作了。但是您也可以通过将矩阵显示代码放入函数中来使其变得更好。然后,您不必到处剪切和粘贴,只需调用该函数即可!这是一个重要的习惯。玩得开心!

【讨论】:

  • @snake plissken :更好的感谢方式是接受答案。
【解决方案3】:
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;
}

这是矩阵转置的代码。

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2014-11-29
    • 2011-07-20
    • 2014-11-24
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多