112 lines
3.2 KiB
C++
112 lines
3.2 KiB
C++
#ifndef GENENALFUNC
|
||
#define GENENALFUNC
|
||
|
||
#include "gamma_alg_global.h"
|
||
|
||
arma::mat QVec2ToMat(QVector<QVector<double> > vec2);
|
||
|
||
arma::umat IsInf(arma::mat d);
|
||
arma::umat IsFinite(arma::mat d);
|
||
|
||
// 矩阵索引 相当于 Matlab 的 mat(mat) 操作;
|
||
template<typename T, typename T2>
|
||
T IdxMat(const T dataMat, const T2 idxMat)
|
||
{
|
||
//bool Ok = true;
|
||
arma::uword data_size = dataMat.n_elem;
|
||
|
||
T retMat;
|
||
if(dataMat.is_vec())
|
||
{
|
||
retMat.set_size(idxMat.size());
|
||
} else {
|
||
retMat.set_size(size(idxMat));
|
||
}
|
||
|
||
for(arma::uword i=0; i<retMat.size(); i++)
|
||
{
|
||
if(idxMat(i) < data_size)
|
||
{
|
||
retMat(i) = dataMat(idxMat(i));
|
||
}
|
||
else { retMat(i) = 0; }
|
||
}
|
||
|
||
//bOk = &Ok;
|
||
return retMat;
|
||
}
|
||
|
||
template<typename T>
|
||
arma::mat MatCols(const arma::mat dataMat, const T idxMat)
|
||
{
|
||
arma::mat retMat(dataMat.n_rows, idxMat.size());
|
||
int cols = dataMat.n_cols;
|
||
for(int i=0; i<idxMat.size(); i++)
|
||
{
|
||
if(idxMat(i) < cols)
|
||
{
|
||
retMat.col(i) = dataMat.col(idxMat(i));
|
||
}
|
||
}
|
||
return retMat;
|
||
}
|
||
|
||
template<typename T>
|
||
arma::mat MatRows(const arma::mat dataMat, const T idxMat)
|
||
{
|
||
arma::mat retMat(idxMat.size(), dataMat.n_cols);
|
||
int rows = dataMat.n_rows;
|
||
for(int i=0; i<idxMat.size(); i++)
|
||
{
|
||
if(idxMat(i) < rows)
|
||
{
|
||
retMat.row(i) = dataMat.row(idxMat(i));
|
||
}
|
||
}
|
||
return retMat;
|
||
}
|
||
|
||
arma::umat OrUMat(arma::umat a, arma::umat b);
|
||
arma::umat AndUMat(arma::umat a, arma::umat b);
|
||
|
||
// 找出矩阵A中所有非零值的行下标(存在向量I中)和列下标(存在向量J中)
|
||
void find(arma::uvec& I, arma::uvec& J, arma::vec &V, arma::mat A);
|
||
|
||
/* 矩阵部分赋值
|
||
* @param dataMat: 被赋值的矩阵
|
||
* @param idxMat: 下标索引矩阵
|
||
* @param valMat: 存储值的矩阵,该矩阵的值将被赋给dataMat矩阵中相应的元素
|
||
*/
|
||
bool MatAssign(arma::mat& dataMat, const arma::umat idxMat, const arma::mat valMat);
|
||
bool MatAssign(arma::mat& dataMat, const arma::umat idxMat, double val);
|
||
bool MatAssign(arma::mat& dataMat, int start, int end, const arma::mat valMat);
|
||
|
||
/* 可代替 Matlab 的 (start:end) 或 start:end
|
||
* 生成一个数据从 start 递增(递增量为1)到 end 且大于等于 start 小于等于 end 的行向量 */
|
||
arma::urowvec RangeVec(int start, int end, int span = 1);
|
||
arma::rowvec RangeVec2(double start, double end, double span = 1);
|
||
|
||
// 对矩阵依据指定列按行排序,相当于Matlab的 sortrows(mat,col),但功能比较少
|
||
arma::uvec sortrows(arma::mat& retMat, arma::mat dataMat, int col = 0);
|
||
|
||
/* T 使用 rowvec 或 colvec
|
||
* 可代替 Matlab 的 [start: span: end] 操作符 和 [start: end] 操作符,注意传参顺序 */
|
||
arma::mat MySpan(arma::mat myData, int start = 0, int end = -1, int span = 1);
|
||
|
||
arma::mat UMatToMat(arma::umat oriMat);
|
||
|
||
double min(double d1, double d2);
|
||
double min(double d1, double d2, double d3);
|
||
double max(double d1, double d2);
|
||
double max(double d1, double d2, double d3);
|
||
arma::mat max(double val, arma::mat dataMat);
|
||
arma::mat min(double val, arma::mat dataMat);
|
||
|
||
// 把矩阵中非数值到元素置为1
|
||
arma::mat NaNto1(arma::mat dataMat);
|
||
arma::rowvec partVec(arma::urowvec col, arma::rowvec idx);
|
||
|
||
int sign(double d);
|
||
|
||
#endif // GENENALFUNC
|