密集矩阵的特征指数
Eigen Indices of Dense Matrix meeting Condition
我希望从符合条件的密集矩阵中获取行/列索引。就我而言,结果可能很少。例如,使用矩阵
1 5 2
7 6 3
2 3 8
我想获得指示系数大于4或
的位置(0,1), (1,0), (1,1), (2,2)
我的最初想法包括使用选择或系数操作来构建bool/int矩阵
0 1 0
1 1 0
0 0 1
,然后将其转换为稀疏矩阵
(0,1,1), (1,0,1), (1,1,1), (2,2,1)
然后删除系数值
(0,1), (1,0), (1,1), (2,2)
但是,这需要两次通过原始矩阵大小的矩阵,这可能很大。
或者是在类似于伪代码的原始矩阵上的幼稚双环
for (int i; i < mat.cols(); i++) {
for (int j; j < mat.rows(); j++) {
if(cond(mat(j, i))) {
add_index(i, j, index_list)
}
}
}
,但这仅采用编译器的优化,并且没有特征的优化/矢量化。
我缺少一种更有效的方法吗?在我的情况下,条件是简单的比较。
感谢您的任何帮助
这里没有太多的矢量化,但是要避免编写两个循环(最好将其用于行 - 莫乔尔存储(,最好的工具是访客:
mat.visit(some_visitor);
可悲的是,访问者不能成为简单的lambda,因为visit
称为第一个元素的方法init(val,0,0)
。这对于减少访客很有用,但并非总是如此。为了使visit
接受简单的lambda,您可以使用以下助手:
template<typename Func>
struct lambda_as_visitor_wrapper : Func {
lambda_as_visitor_wrapper(const Func& f) : Func(f) {}
template<typename S,typename I>
void init(const S& v, I i, I j) { return Func::operator()(v,i,j); }
};
template<typename Mat, typename Func>
void visit_lambda(const Mat& m, const Func& f)
{
lambda_as_visitor_wrapper<Func> visitor(f);
m.visit(visitor);
}
在您的情况下,您可以写作:
int main() {
int n = 5;
double th = 0.5;
Eigen::MatrixXd M = Eigen::MatrixXd::Random(n,n);
std::vector<std::pair<int,int>> indices;
visit_lambda(M,
[&indices,th](double v, int i, int j) {
if(v>th)
indices.push_back(std::make_pair(i,j));
});
std::cout << M << "nn";
for(auto p:indices)
std::cout << '(' << p.first << ',' << p.second << ") ";
std::cout << 'n';
return 0;
}
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 使用简单类型列表实现的指数编译时间.为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- 特征:模板函数中矩阵的平面图
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 特征 c++:复矩阵的面积双曲正切(atanh)
- C++ 中的特征向量计算
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 有没有办法找到特征矩阵系数的中值?
- 如何将高维数据映射到特征类型?
- 将平面阵列重塑为复杂的特征类型
- 特征 LLT 模块给出不正确的结果?
- 特征模板化函数和维度
- 密集矩阵的特征指数
- 对于指数,特征表达式模板比手动循环慢