2017-02-06 168 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:公衆的boost ::數字:: uBLAS庫::矩陣'。這讓我花更多時間陪伴我的家人。 – Bathsheba

+2

看來你想'MATX(的std :: initializer_list <性病:: 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]; 
     } 
    } 
}