2014-04-30 2 views
2

I는 행렬의 행렬식을 계산하고있어, 계산 및 따라서 방법은, 예를 들어, 데이터의 차원에 따라 호출 : I는 데C++ 반복자 - 추론 차원

template<int X, int Y> 
float determinant(X, Y, std::vector<Vector> &data) 
{ 
    // Determine the dimensionality of matrix data (x and y) 
} 

문제

class PCA { 

    public: 

     template<typename T> 
     PCA(T begin, T end) 
     { 
      // Determine the X and Y here 
      float det = determinant(X, Y, ....); 
     } 
}; 

지금 나는 통과 된 반복자에서 XY을 추론 할 수 있는지 여부를 궁금 :이 함수를 호출 PCA를 계산하는 클래스 만의 반복자를 받아들이는 것입니다 목 말라 h PCA가 아니라 두 개의 정수 값을 전달합니다.

가 어떤 조언을 크게

을 주시면 감사하겠습니다 편집 :

사과, 내 질문은 분명하지 않다.

기본적으로 typedef std::vector<double> Vector;이 사용되므로 std::vector<Vector> data;은 벡터의 벡터가됩니다.

나는이 다음을 수행 샘플 :

std::vector<Vector> data1 = { {1, 2}, {3, 4}, {5, 6}, {8, 9} }; // 2x2 나는 다음과 같은 추가 할 때 반면 : 행렬식을 계산할 때 std::vector<Vector> data2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; // 3x3 너무 분명,이에 대해 다른 계산이있다.

I 그 DATA1을 추론 할 특별히 이들 값을 전달하지 않고 함수로부터 2 × 2와 데이터 2 × 3이다.

+2

도움이 필요하면 반복기 코드를 게시해야합니다. –

+0

여기에 X와 Y 유형이 무엇입니까 (int가 아닌 이유는 무엇입니까?)? 반복자는 누가 정의합니까? iterator를 정의하면 iterator의 정의에 typedef를 넣고 determinant와 같은 sth를 수행 할 수 있습니다. (T :: DIMType1, T :: DIMType2) – szli

+0

@Marco 반복자의 코드를 어떻게 의미합니까? 죄송합니다 – Phorce

답변

1

벡터가 아니기 때문에 고정 크기들은 톱니 수 있었다. (이것을 std::array<> 또는 T [N][M][L]과 같이 사용하면 컴파일시 순위를 추론 할 수 있습니다.)

의 그들이하지 않은 가정 해 봅시다 : 그것은 Live On Coliru

#include <vector> 
#include <cstdint> 
#include <deque> 

template <typename V> 
    std::deque<std::size_t> dims_of(V const& v) { 
    return {}; 
} 

template <typename T> 
    std::deque<std::size_t> dims_of(std::vector<T> const& v) 
{ 
    if (v.empty()) 
     return { 0 }; 
    else 
    { 
     auto dims = dims_of(v.front()); 
     dims.push_front(v.size()); 
     return dims; 
    } 
} 

#include <iostream> 

int main() 
{ 
    std::vector<std::vector<std::vector<int> > > const 
     v(7, std::vector<std::vector<int> >(
      10, std::vector<int>(3, 0) 
      ) 
     ); 

    for (auto dim : dims_of(v)) 
     std::cout << dim << " "; 

} 

인쇄

7 10 3 
+0

나는이 방법을 정말 좋아한다. 내 주된 관심사는 클래스 "PCA"또는 네임 스페이스 "결정 요인"으로 들어가는 것입니까? – Phorce

+0

둘 다 AFAICS를 수행 할 수 있습니다. 정말 유틸리티 함수 일 뿐이므로'Determinant :: details' 네임 스페이스에있을 수 있습니다. – sehe

+0

그냥 깨달았을 텐데,이 두 가지 템플릿 인수를 통과시킬 수 없습니까? 이들은 상수가 아닙니다. – Phorce

0

참조 무엇 X와 Y

template<int X,int Y> 
PCA_size : public PCA 
{ 
     enum { Xv=X}; 
     enum { Yv=Y}; 

} 

을 보유하고 클래스로 PCA에서 파생에 대한 그러면 기존 PCA 개체를 자신의 개체로 다시 변환 할 수 있습니다.

static_cast<PCA_size<3,5> >(PCA_instance);