2

動的2D配列の転置関数を作成したいと思います。関数に2次元配列と行と列をパラメーターとして持たせたいです。ダブルポインタを使うことにしました。ただし、メインから関数を呼び出す方法について、imaは少し混乱しています。だから私は上記のコードを持っています

#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;
}

何か案が?

4

3 に答える 3

5

コードにはいくつかの大きな問題があります。

最大の問題は、aが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))
于 2011-12-18T02:18:14.570 に答える
5

あなたはとても近いです。関数を正しく呼び出しており、関数のパラメーターリストが正しいです。まず、転置関数からこのセクションを削除します。

 mat = new double*[rows];

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

 }

次に、すべての角かっこが一致していることを確認します。x[y][z](欠落しているものが1つありました。)サイズ引数として非定数変数を使用して静的配列(次のようなもの)を定義することはできません。(つまり、定数yzなければなりません。)しかし、実際には、動的配列を転置関数に渡しているので、それを行うために定数である必要はrowsありcolumnsません。したがって、主に、次のような動的配列を定義します。

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

その後、コードは機能するはずです。ただし、行列表示コードを関数に入れることで、さらに改善することもできます。次に、それをどこにでも切り取って貼り付ける代わりに、関数を呼び出すだけです!入るのは重要な習慣です。楽しむ!

于 2011-12-18T02:34:21.717 に答える
2
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;
}

行列を転置するためのコードは次のとおりです。

于 2015-02-12T21:15:54.087 に答える