teo*_*ron 1 c++ performance memory-management matrix eigen
我有一个算法,需要在函数内构建 NxN 矩阵,该函数将返回该矩阵与同样动态构建的 Nx1 向量的乘积。(N 通常为 8 或 9,但对于大于该值的值必须进行概括)。
我正在使用 Eigen 库来执行更复杂的代数运算(最小二乘和其他几个约束问题),因此不能选择切换它。
我对这些函数进行了基准测试,由于密集的内存分配,存在巨大的瓶颈。我的目标是构建一个线程安全的应用程序,因此,在某些情况下,我将这些矩阵和向量替换为对全局向量中元素的引用,该全局向量充当无法存储在堆栈上的对象的提供者。这避免了调用特征矩阵和向量的构造函数/析构函数,但这不是一个优雅的解决方案,如果不小心的话,可能会导致巨大的问题。
因此,Eigen 是否提供了一种解决方法,因为我没有看到将分配器作为这些对象的模板参数传递的选项,或者是否有更明显的事情要做?
您可以以适合您的需求的方式管理自己的内存并使用它Eigen::Map
,而不是Eigen::Matrix
用它来执行计算。只需确保数据正确对齐,如果未正确对齐,请通知 Eigen。
有关详细信息,请参阅参考Eigen::Map。
这是一个简短的例子:
#include <iostream>
#include <Eigen/Core>
int main() {
int mydata[3 * 4]; // Manage your own memory as you see fit
int* data_ptr = mydata;
Eigen::Map<Eigen::MatrixXi, Eigen::Unaligned> mymatrix(data_ptr, 3, 4);
// use mymatrix like you would any another matrix
mymatrix = Eigen::MatrixXi::Zero(3, 4);
std::cout << mymatrix << '\n';
// This line will trigger a failed assertion in debug mode
// To change it see
// http://eigen.tuxfamily.org/dox-devel/TopicAssertions.html
mymatrix = Eigen::MatrixXi::Ones(3, 6);
std::cout << mymatrix << '\n';
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4361 次 |
最近记录: |