2017-02-06 8 views
0

線形代数計算のための行列クラスを記述しようとしています。私は欲しいものを書き終えました。リストの初期化を使用して行列を作成するコンストラクタを作成するのに少し問題があります。 これは私のクラスのデータメンバである:行列クラスのリスト初期化

template <typename T> 
class Matx 
{ 
private: 
    // data members 
    //rows and columns of matrix 
    int rows, cols; 
    //pointer to pointer to type T 
    T** matrix; 

、これは初期化のために私のコードです:メインで

template <typename T> 
Matx<T>::Matx(T* ptM[], int m, int n) : rows(m), cols(n) 
{ 
    matrix = new T*[rows]; 
    for (int i = 0; i < rows; i++) 
     matrix[i] = new T[cols]; 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      matrix[i][j] = *(ptM[i] + j); 
} 

double mat[][5] = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } }; 
double* pm[5]; 
for (int i=0;i<5;i++) 
    pm[i]=mat[i]; 
Matx<double> yourMat = Matx<double>(pm, 5,5); 

が、私は行うには良い方法があると思いますそれ。 私が望むのは、配列のように初期化できることです。このようなもの:

Matx<double> yourMat = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } }; 

可能でしょうか?

+2

これは私の行列クラスです: 'テンプレート クラスmatrixT:公共ブースト::数値:: ublas ::行列'。これにより私は家族とより多くの時間を過ごすことができます。 – Bathsheba

+2

'Matx(std :: initializer_list >)'が必要です。 – Jarod42

+0

パフォーマンスを向上させるには、行列をフラットな配列に格納し、数学を使用してディメンションを偽装することを検討する必要があります。これにより、キャッシュのローカリティが大幅に向上します。 – NathanOliver

答えて

0

間違いなく、私は同様のクラスに対して初期化子リストを使用するコンストラクタを作成しました。このようなコンストラクタ仕事をする必要があります。

template <typename T> 
Matx<T>::Matx(std::initializer_list<std::initializer_list<T>> listlist) { 
    rows = (int)(listlist.begin()).size(); 
    cols = (int)listlist.size(); 

    matrix = new T*[rows]; 

    for (int i = 0; i < rows; i++) { 
     matrix[i] = new T[cols]; 
     for (int j = 0; j < cols; j++) { 
      matrix[i][j] = (listlist.begin()+i)[j]; 
     } 
    } 
}