C 使用Eigen庫實現K L變換

2021-09-01 03:04:46 字數 2936 閱讀 2685

我就是來水一篇部落格的。。。

k-l變換實現 屬於特徵提取與選擇這一章,實現上唯一的遺憾是不確定 n 和 dimension 是否可以在 compile time 確定。

比上次的 apriori 和 fpgrowth 要水很多

#include

#include

#include

#include

#include

#include

#include

namespace eigen = eigen;

#define output_intermediate_result

template

<

std::size_t n,

typename

= std::enable_if_t<

(n >0)

>

> std::vector

// return matrix: (d x 1) - vector

kl_transformation

(const std::vectordouble

, n,

1>>

& vectors,

const std::size_t dimension)

; eigen::matrix<

double

, n, n> _diag = _es.

pseudoeigenvaluematrix()

; eigen::matrix<

double

, n, n> _eigen_vectors = _es.

pseudoeigenvectors()

;#ifdef output_intermediate_result

std::cout <<

"eigen value diag:"

<< std::endl;

std::cout << _diag << std::endl << std::endl;

std::cout <<

"eigen vectors:"

<< std::endl;

std::cout << _eigen_vectors << std::endl << std::endl;

#endif

// output_intermediate_result

// sort

std::vectordouble

, std::size_t>> _eigenvalues

;for

(std::size_t i =

0; i < n; i++

) _eigenvalues[i]

= std::pair<

double

, std::size_t>

(_diag

(i, i)

, i)

; std::

sort

(_eigenvalues.

begin()

, _eigenvalues.

end(),

(const std::pair<

double

, std::size_t>

& lhs,

const std::pair<

double

, std::size_t>

& rhs));

// 3. construct transformation matrix u

eigen::matrixxd u

;for

(std::size_t i =

0; i < dimension; i++

) u.

block(0

, i, n,1)

= _eigen_vectors.

block(0

, _eigenvalues[i]

.second, n,1)

;#ifdef output_intermediate_result

std::cout <<

"transformation matrix u:"

<< std::endl;

std::cout << u << std::endl << std::endl;

#endif

// output_intermediate_result

// 4. k-l transformation

const

auto u_t = u.

transpose()

; std::vector transformation_result;

transformation_result.

reserve

(vectors.

size()

);for(

const eigen::matrix<

double

, n,

1>

& v : vectors)

transformation_result.

push_back

(u_t * v)

;return transformation_result;

}void

test_kl()

std::vector transformation_result = kl_transformation

(vectors, dimension)

; std::cout <<

"k-l transformation result:"

<< std::endl;

for(

auto

const

& v : transformation_result)

std::cout << v << std::endl;

}int

main()

C 實現離散余弦變換(引數為Eigen矩陣)

問題描述 昨天寫了乙個引數為二維指標為引數的離散余弦變換,雖然改進了引數為二維陣列時,當陣列大小不確定時宣告函式時帶來的困難,但使用指標作為引數也存在一些不足之處,比如需要手動定址 容易出現指標越界等。因此這篇文章中的 對昨天的 做了進一步的改進,將函式的引數設定為eigen矩陣,很好的避免了上述問...

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...