2017-02-06 5 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]; 
     } 
    } 
}