如何解决对特征矩阵执行布尔系数运算并返回找到的元素的索引
我试图找到一种最快的方法来对特征矩阵执行 ><=|&
运算并返回找到的元素的索引。
现在我可以像我的例子一样分两步完成:
#include <Eigen/Dense>
#include <iostream>
#include <chrono>
template <typename T>
Eigen::VectorX<Eigen::Index> findNonZeroInd(const Eigen::DenseBase<T> &M){
Eigen::VectorX<Eigen::Index> ind(M.size());
Eigen::Index ii = 0;
for (Eigen::Index i = 0; i < M.size(); i++){
if (M(i) != 0){
ind(ii) = i;
ii++;
}
}
ind.conservativeResize(ii);
return ind;
}
int main()
{
size_t N = 3000;
Eigen::MatrixXd m = Eigen::MatrixXd::Random(N,N);
Eigen::MatrixX<bool> ar = m.array() > 0;
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::Now();
Eigen::VectorX<Eigen::Index> ind = findNonZeroInd(ar);
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::Now();
std::cout << "Eigen-find Time difference = " << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() << "[µs]" << std::endl;
return 0;
}
在我的示例中,操作 Eigen::MatrixX<bool> ar = m.array() > 0;
大约需要 11-14 毫秒,而 Eigen::VectorX<Eigen::Index> ind = findNonZeroInd(ar);
大约需要 80 毫秒。
我觉得它可以改进,但我在 C++ 和 Eigen 方面的经验不够。
那么有没有办法提高性能?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。