我浏览了 eigen 的教程 https://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixArithmetic.html
它说“注意:对于担心性能的 BLAS 用户,诸如 c.noalias() -= 2 * a.adjoint() * b; 之类的表达式已完全优化并触发单个类似 gemm 的函数调用。”
但是像 H.transpose() * H 这样的计算怎么样,因为它的结果是一个对称矩阵,所以它应该只需要正常 A*B 一半的时间,但在我的测试中, H.transpose() * H 花费与 H 相同的时间.transpose() * B. eigen对于这种情况有没有特殊的优化,像opencv一样,有类似的功能。
我知道对称优化会破坏矢量化,我只想知道特征是否有可以同时提供对称优化和矢量化的解决方案
我发现两个旋转矩阵
rot1 = [ 0.8736 0.2915 -0.3897;
-0.4011 0.8848 -0.2373;
0.2756 0.3636 0.8898]
rot2 = [ 0.9874 -0.1420 -0.0700;
0.0700 0.7880 -0.6117;
0.1420 0.5991 0.7880]
Run Code Online (Sandbox Code Playgroud)
当向量相乘时
wpt = [200 200 200]
Run Code Online (Sandbox Code Playgroud)
产生相同的结果
cpt = [155.0812 49.2660 305.8148]
Run Code Online (Sandbox Code Playgroud)
谁能解释一下吗?
我知道reserve(n)仅分配n个空间,但大小为零。
而resize(n)分配n个空间,大小为n。
但是当我在测试中通过窗口任务管理器观察到内存变化时,我对结果感到困惑。
我的代码已经占用了100MB,然后逐步测试以下代码:
vector<Eigen::Vector4f> vec;
vec.resize(5000000); //memory still take 100MB???
vec.push_back(Eigen::Vector4f::Zero()); //memory take 181MB???
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么调整大小直到有push_back才改变内存
vector<Eigen::Vector4f> vec;
vec.reserve(5000000); //memory still take 100MB???
for(int i = 0 ; i < 5000000; i++){
vec.push_back(Eigen::Vector4f::Zero()); // memory increase one by one from 100MB to 181MB
}
Run Code Online (Sandbox Code Playgroud)
预留也没有分配内存?为什么?