2014-04-30 59 views
2

我計算矩陣的行列式,計算和因此的方法根據數據的維數稱爲例如:C++迭代 - 推導維

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

,我遇到的問題是在計算PCA,調用該函數的類,只接受一個迭代器:

class PCA { 

    public: 

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

現在我想知道它是否可以推斷出已通過迭代器XY通過量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如此明顯,計算行列式時有此不同的計算。

欲推斷DATA1是從功能的2×2和3×3 DATA2而不必在特別通過這些值。

+2

如果您需要任何幫助,您需要發佈該迭代器的代碼。 –

+0

什麼是X和Y類型(爲什麼不只是int?)?誰定義了迭代器?如果你定義了迭代器,你可以在迭代器的定義中放入typedef,並做類似於行列式(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

怎麼樣從PCA導出到保存的X和Y

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

} 

類然後,您可以將現有的PCA對象重新塑造成您的

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