我就是來水一篇部落格的。。。
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混合...