2014-09-23 1 views
1

Numerical Recipes 'dmatrix을 사용하는 오래된 응용 프로그램을 아주 광범위하게 개편하고 있습니다. 응용 프로그램에서 작업하는 이유 중 하나는 코드가 열리려고하기 때 문에 모든 숫자 래서 피 코드를 자유롭게 배포 할 수있는 코드로 바꾸고 싶습니다.Numerical Recipe의 dmatrix를 C++ 클래스로 바꾸기

dmatrix은 복식의 매트릭스를 반환하는 함수입니다. 과 같이 각각의 인덱스에 대한 호출 용품 하한 및 상한 :

double **mat = dmatrix(1,3,1,3); 

mat 이제 1~3 3 행 1 내지 3, 3 열을 보유 mat[1][1] 첫번째 요소되도록 mat[3][3]이 마지막입니다.

다양한 C++ 행렬 구현을 살펴 보았지만 어느 것도 각 차원의 하한을 지정할 수 없었습니다. 사용할 수있는 무언가가 있습니까? 아니면 이에 대한 또 다른 행렬 클래스를 작성해야합니까?

+1

기존 구현을 본 적이 없습니다 (단 하나 여야합니다.). 사용자가 직접 새 구현을 작성하려는 경우 기존 구현에서 상속하여 테스트 비용을 줄일 수 있습니다. –

+0

비슷한 클래스를 C++로 작성하는 것은 상대적으로 간단합니다.하지만 성능을 테스트해야합니다. 결국 'double **'만큼 빠르기 때문입니다. – zmbq

+1

Yuck : -/그 대신 lower bound zero를 사용하도록 나머지 코드를 변경할 수 있습니까? 커버 아래에서 이전 코드는 인덱스가 일반 이중 포인터에서 작동하도록 과도하게 할당해야합니다. – Rup

답변

1

다른 행렬 구현의 래퍼를 쉽게 작성하여 하한 기능을 추가 할 수 있다고 생각합니다. 예 (테스트 안 함) :

class Matrix { 
    OtherMatrix m; 
    int lowerX, lowerY; 
public: 

    Matrix(int lx, int hx, int ly, int hy) : 
     m(hx-lx, hy-ly), 
     lowerX(lx), lowerY(ly) { } 

    MatrixCol operator[] (int x) { 
     return {this, x}; 
    } 
}; 

class MatrixCol { 
    friend class Matrix; 
    Matrix* mm; 
    int x; 
public: 
    double& operator[] (int y) { 
     return mm->m[x - mm->lowerX, y - mm->lowerY]; 
    } 
}; 

사용 사례에 따라 좀 더 강력한 구현이 필요할 수 있습니다. 그러나 이것은 기본적인 생각이며, 그것으로부터 확장됩니다.

+0

네, 그게 더 많거나 적습니다. 다른 Matrix 클래스가 없어도 std :: vector (기본적으로 NR은 C 배열에만 해당)라는 벡터를 사용하고 있습니다. – zmbq

+1

@ zmbq : 기술적으로, NR은 C 배열을 제로 색인화 된 것으로 사용하지 않습니다. 그들은 오히려 모호한 포인터 남용에 의존하고 있습니다. – MSalters

+0

바로. 그리고 그것은 C++에서 모방하려고하는 포인터 남용입니다. 다른 NR 계산을 대신 할 것이지만, 다른 코드는이 같은 포인터 남용을 기반으로합니다. – zmbq